Golang笔记|Atomic

作用与优势

atomic 包是 Go 语言中用于进行原子操作的标准库。原子操作是一种在多线程并发编程中用来确保数据安全的机制,它可以防止多个线程同时访问同一个资源而导致的数据竞争问题。

atomic 包中的函数是原子操作,它们在执行时不会被中断,从而确保操作的不可分割性。这对于执行复杂的操作,如比较并交换,是非常重要的。

在某些情况下,使用互斥锁来保护共享变量可能会导致额外的锁开销和上下文切换,从而影响性能。atomic 包的原子操作不需要使用锁,可以减少这些开销。

原子操作通常比互斥锁更高效,特别是在一些轻量级的操作中。在高并发的情况下,使用原子操作可以提高程序的性能。

适用场景

  • 计数器和累加器: 当多个协程需要对一个共享的计数器或累加器进行增加、减少或重置操作时,使用 atomic包可以避免数据竞争,确保操作的原子性。
  • 标志位和状态切换: 当多个协程需要读取和修改某个共享的标志位或状态值时,使用 atomic包可以确保状态的正确性,避免并发修改导致的问题。
  • 缓存更新和缓存失效: 在缓存中存储的数据需要经常更新,且更新频率较高时,使用 atomic包可以保证更新操作的一致性,防止多个协程同时更新而导致的问题。
  • 资源池管理: 当多个协程需要从资源池中获取或释放资源时,使用 atomic 包可以保证资源池的状态正确,避免资源泄漏和竞争条件。
  • 引用计数: 在一些场景中,可能需要使用引用计数来管理共享资源的生命周期。使用 atomic 包可以确保引用计数的增加和减少操作是原子的。

atomic包中的函数

  1. atomic.AddInt32, atomic.AddInt64,atomic.AddUint32,atomic.AddUint64:原子地将指定的值加到一个整数变量上。
  2. atomic.LoadInt32,atomic.LoadInt64,atomic.LoadUint32,atomic.LoadUint64:原子地读取一个整数变量的值。
package mainimport ("fmt""sync""sync/atomic""time"
)func main() {var counter int64var wg sync.WaitGroupfor i := 0; i < 10; i++ {wg.Add(1)go func() {for j := 0; j < 1000; j++ {atomic.AddInt64(&counter, 1)}wg.Done()}()}wg.Wait()fmt.Println("Counter value:", atomic.LoadInt64(&counter))
}
  1. atomic.StoreInt32, atomic.StoreInt64, atomic.StoreUint32, atomic.StoreUint64:原子地将指定的值写入到一个整数变量中。
package mainimport ("fmt""sync""sync/atomic"
)func main() {var value int64var wg sync.WaitGroup// 启动多个协程尝试存储值for i := 0; i < 10; i++ {wg.Add(1)go func(i int) {defer wg.Done()// 原子地将值设置为协程的编号atomic.StoreInt64(&value, int64(i))fmt.Printf("Goroutine %d: Stored value %d\n", i, i)}(i)}wg.Wait()fmt.Printf("Final value: %d\n", value)
}
  1. atomic.CompareAndSwapInt32, atomic.CompareAndSwapInt64, atomic.CompareAndSwapUint32, atomic.CompareAndSwapUint64:比较并交换,比较当前addr地址里的值是不是old,如果不等于old,就返回false; 如果当前等于old,就把此地址的值替换成new值,返回true。
package mainimport ("fmt""sync""sync/atomic"
)func main() {var value int64 = 0var wg sync.WaitGroup// 启动多个协程尝试修改值for i := 0; i < 10; i++ {wg.Add(1)go func(i int) {defer wg.Done()// 尝试将值从旧值0修改为新值10swapped := atomic.CompareAndSwapInt64(&value, 0, 10)if swapped {fmt.Printf("Goroutine %d: Value swapped successfully\n", i)} else {fmt.Printf("Goroutine %d: Value was not swapped\n", i)}}(i)}wg.Wait()fmt.Printf("Final value: %d\n", value)
}
  1. atomic.SwapInt32, atomic.SwapInt64, atomic.SwapUint32, atomic.SwapUint64:原子地交换一个整数变量的值。如果不需要比较旧值,只是比较粗暴地替换的话,就可以使用Swap方法。

```go
package mainimport ("fmt""sync""sync/atomic"
)func main() {var value int64 = 5var wg sync.WaitGroup// 启动多个协程尝试交换值for i := 0; i < 10; i++ {wg.Add(1)go func(i int) {defer wg.Done()// 原子地交换值为新值10,并获取旧值oldValue := atomic.SwapInt64(&value, 10)fmt.Printf("Goroutine %d: Swapped value from %d to 10\n", i, oldValue)}(i)}wg.Wait()fmt.Printf("Final value: %d\n", value)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/187859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(二)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、Tiki-taka算法&#xff08;TTA&#xf…

数据爬取+可视化实战_告白气球_词云展示----酷狗音乐

一、前言 歌词上做文本分析&#xff0c;数据存储在网页上&#xff0c;需要爬取数据下来&#xff0c;词云展示在工作中也变得日益重要&#xff0c;接下来将数据爬虫与可视化结合起来&#xff0c;做个词云展示案例。 二、代码 # -*- coding:utf-8 -*- # 酷狗音乐 通过获取每首歌…

大数据中的HBase的选择题

一. 单选题&#xff08;共9题&#xff0c;49.5分&#xff09; (单选题)下列关于BigTable的描述,哪个是错误的? A. 爬虫持续不断地抓取新页面,这些页面每隔一段时间地存储到BigTable里 B. BigTable是一个分布式存储系统 C. BigTable起初用于解决典型的互联网搜索问题 D. 网络搜…

使用com组件编辑word

一个普通的窗体应用&#xff0c;6个button using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; u…

实现简单的Spring

Spring 1、Spring IOC步骤 1.1、扫描组件 1.2、实例化存入容器 1.3、实例注入 2、扫描组件 被注解标记的类&#xff0c;即需要实例化的类&#xff0c;统称为组件。 1、扫描包&#xff1a;类集合 function&#xff08;包名&#xff09;&#xff0c;收集包下的所有类。 …

项目实战之RabbitMQ冗余双写架构

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;项…

Linux 重启systemd 进程

当升级库文件后&#xff0c;那些使用该库的服务需要重启后才会真正使用该库文件中的内容。一个常用的方法是直接重启系统&#xff0c;这样所有服务在启动时自然使用的是最新库的内容&#xff0c;但是作为服务器是不可能允许随意重启的&#xff0c;那么在不重启的情况下如何找出…

将本地项目推送到github

欢迎大家到我的博客浏览。将本地项目推送到github | YinKais Blog 本地项目上传至 GitHub<!--more--> 1、进入项目根目录&#xff0c;初始化本地仓库 git init 2、创建密钥&#xff1a;创建 .ssh 文件夹&#xff0c;并进入 .ssh 文件夹 mkdir .ssh cd .ssh/ 3、生成…

关于 SLO,我们需要了解什么?

什么是 SLO&#xff1f; SLO&#xff08;Service Level Objective&#xff09;是服务质量目标的短语缩写。它通常指的是维护系统的最高级别的目标&#xff0c;或服务等级协议&#xff08;SLA&#xff09;中的服务质量目标。它能够定义客户和用户在使用软件系统时所期望的服务质…

基于ssh的盘锦河蟹销售系统

摘 要 如今&#xff0c;互联网时代的到来&#xff0c;在社会环境的带动下&#xff0c;各行各业都被科技的发展推着前进。提高了生活效率&#xff0c;越来越多行业已经实现了信息管理自动化&#xff0c;商品销售行业也不例外。如今伴随着5G互联网时代的来到&#xff0c;网上浏览…

云服务器anaconda(py39)+pytorch1.12.0(cu113)

用xshell连接ip地址&#xff0c;端口号22&#xff0c;输入用户密码 查看当前版本 conda -V conda info --envs 如果不是需要的版本&#xff0c;使用 anaconda-clean --yes rm -rf anaconda3 删除文件夹 安装anaconda 2022 10 py3.9 wget https://repo.anaconda.com/archi…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之存储管理(2)》(15)

[TOC](《Linux操作系统原理分析之存储管理&#xff08;2&#xff09;》&#xff08;15&#xff09; 5 存储管理5.4 分页存储管理5.4.1 纯分页存储管理a.页&#xff08;页面&#xff09;和物理块&#xff08;帧&#xff09;b. 页面大小c. 逻辑地址结构 5.5 存储扩充技术5.5.2 交…

用友NC 漏洞

漏洞描述 用友ERP-NC 存在目录遍历漏洞&#xff0c;攻击者可以通过目录遍历获取敏感文件信息。 fofa&#xff1a; poc&#xff1a;/NCFindWeb?serviceIPreAlertConfigService&filename 在url处拼接poc后可以看到该站点的目录和文件 访问某个文件 /NCFindWeb?serviceIPr…

一文搞懂微前端

一. 微前端的背景和动机 单页应用 单页应用往往是一个庞大的前端项目&#xff0c;由一个团队或多个团队共同开发&#xff0c;使用同一套技术栈&#xff0c;打包成一个整体&#xff0c;部署在一个域名下 随着 Web 应用的功能越来越丰富和复杂&#xff0c;单页应用不得不面临以下…

QMLfor python pyside6

QML QML是一种用于创建用户界面的声明性语言&#xff0c;它是Qt生态系统中的一部分。QML使用JavaScript语言和其独特的语法来定义用户界面组件&#xff0c;使得开发人员可以轻松地创建现代化、漂亮而又响应迅速的应用程序。 QML是基于QtQuick技术构建的&#xff0c;QtQuick是…

【JavaScript】3.4 JavaScript在现代前端开发中的应用

文章目录 1. 用户交互2. 动态内容3. 前端路由4. API 请求总结 JavaScript 是现代前端开发的核心。无论是交互效果&#xff0c;还是复杂的前端应用&#xff0c;JavaScript 都发挥着关键作用。在本章节中&#xff0c;我们将探讨 JavaScript 在现代前端开发中的应用&#xff0c;包…

上门服务系统|东郊到家软件提供高效服务的科技支柱

预约上门服务系统的崛起改变了传统服务行业的格局。用户不再需要亲自前往实体店面&#xff0c;而是通过几次点击就能享受到各类服务。这背后离不开预约上门服务系统的智能化和高效性&#xff0c;而源码正是这个系统的灵魂所在。下面小编就给大家介绍下上门服务系统开发优势。 1…

Gavin Wood:财库保守主义偏离了初心,应探索 Fellowship 等更有效的资金部署机制

波卡创始人 Gavin Wood 博士最近接受了 The Kusamarian 的采访&#xff0c;分享了他的过往经历、对治理的看法&#xff0c;还聊到了 AI、以太坊、女巫攻击、财库等话题。本文整理自 PolkaWorld 对专访编译的部分内容&#xff0c;主要包含了 Gavin 对治理、财库提案、生态资金分…

人工智能_机器学习056_拉格朗日乘子法原理推导_公式由来详解_原理详解---人工智能工作笔记0096

https://blog.csdn.net/Soft_Po/article/details/118332454 这里有老师的一篇文章介绍拉格朗日乘子法的原理推导 结合老师的这篇文章我们来看一下详细的推导过程 可以看到上一节我们说,一个有条件的,函数,可以转换为一个,无条件的函数, 根据拉格朗日乘子法,可以创建出一个等…

uc_09_创建新进程 exec() system()

1 什么是创建新进程(夺舍) 在前面文章中&#xff0c;我们学习了fork()函数用来创建子进程。 子进程是父进程的副本&#xff0c;复制父进程除代码段以外的其他数据&#xff0c;代码段数据和父进程共享。 子进程的PID与父进程不同&#xff1a; 而创建新进程则不同。 与fork()不同…