广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go语言并发编程 sync.Once
  • 121
分享到

Go语言并发编程 sync.Once

2024-04-02 19:04:59 121人浏览 八月长安
摘要

sync.Once用于保证某个动作只被执行一次,可用于单例模式中,比如初始化配置。我们知道init()函数也只会执行一次,不过它是在main()函数之前执行,如果想要在代码执行过程中

sync.Once用于保证某个动作只被执行一次,可用于单例模式中,比如初始化配置。我们知道init()函数也只会执行一次,不过它是在main()函数之前执行,如果想要在代码执行过程中只运行某个动作一次,可以使用sync.Once,下面来介绍一下它的使用方法。

先来看下面的代码:


package main

import (
 "fmt"
 "sync"
)


func main() {
 var num = 6
 var once sync.Once

 add_one := func() {
  num = num + 1
 }

 minus_one := func() {
  num = num - 1
 } 

 once.Do(add_one)
 fmt.Printf("The num: %d\n", num)
 once.Do(minus_one)
 fmt.Printf("The num: %d\n", num)
}

执行结果:

The num: 7
The num: 7

sync.Once类型提供了一个Do方法,Do方法只接受一个参数,且参数类型必须是func() ,也就是没有参数声明和结果声明的函数。

Do方法只会执行首次被调用时传入的那个函数,只执行一次,也不会执行其它函数。上面的例子中,即使传入的函数不同,也只会执行第一次传入的那个函数。如果有多个只执行一次的函数,需要为每一个函数分配一个sync.Once类型的值:


func main() {
 var num = 6
 var once1 sync.Once
 var once2 sync.Once

 add_one := func() {
  num = num + 1
 }

 minus_one := func() {
  num = num - 1
 } 

 once1.Do(add_one)
 fmt.Printf("The num: %d\n", num)
 once2.Do(minus_one)
 fmt.Printf("The num: %d\n", num)
}

sync.Once类型是一个结构体类型,一个是名为doneuint32类型字段,还有一个互斥m


type Once struct {
 done uint32
 m    Mutex
}

done字段的值只可能是0或者1,Do方法首次调用完成后,done的值就变为了1。done的值使用四个字节的uint32类型的原因是为了保证对它的操作是“原子操作”,通过调用atomic.LoadUint32函数获取它的值,如果为1,直接返回,不会执行函数。

如果为0,Do方法会立即锁定字段m,如果这里不加锁,多个Goroutine 同时执行到Do方法时判断都为0,则都会执行函数,所以Once并发安全的。

加锁之后,会再次检查done字段的值,如果满足条件,执行传入的函数,并用原子操作函数atomic.StoreUint32done的值设置为1。

下面是Once的源码:


func (o *Once) Do(f func()) {

 if atomic.LoadUint32(&o.done) == 0 {
  o.doSlow(f)
 }
}

func (o *Once) doSlow(f func()) {
 o.m.Lock()
 defer o.m.Unlock()
 if o.done == 0 {
  defer atomic.StoreUint32(&o.done, 1)
  f()
 }
}

源码非常简洁,和GoF 设计模式中的单例模式非常相似。

到此这篇关于Go语言并发编程 sync.Once的文章就介绍到这了,更多相关Go语言 sync.Once内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Go语言并发编程 sync.Once

本文链接: https://www.lsjlt.com/news/154532.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go语言并发编程 sync.Once
    sync.Once用于保证某个动作只被执行一次,可用于单例模式中,比如初始化配置。我们知道init()函数也只会执行一次,不过它是在main()函数之前执行,如果想要在代码执行过程中...
    99+
    2022-11-12
  • Go并发编程之sync.Once使用实例详解
    目录一.序二. 源码分析2.1结构体2.2 接口三. 使用场景案例3.1 单例模式3.2 加载配置文件示例四.总结五. 参考一.序 单从库名大概就能猜出其作用。sync.Once使用...
    99+
    2022-11-12
  • Go语言并发编程有多重要?
    当今互联网时代,随着数据量的增长、用户量的增加,高并发成为了各个领域的关键词。在这个背景下,Go语言的并发编程能力得到了广泛的认可和应用。那么,Go语言并发编程到底有多重要呢? 首先,让我们了解一下Go语言并发编程的基本概念。Go语言通过g...
    99+
    2023-06-01
    并发 异步编程 索引
  • Go语言并发编程 互斥锁详情
    目录1、互斥锁Mutex 1.1 Mutex介绍 1.2 Mutex使用实例2、读写锁RWMutex 2.1 RWMutex介绍2.2 RWMutex使用实例1、互斥锁Mutex ...
    99+
    2022-11-12
  • GO语言并发编程:如何应对高并发场景?
    在现代互联网时代,高并发场景已经成为了很常见的问题。在这种情况下,GO语言的并发编程能力显得尤为重要。GO语言提供了丰富的并发编程工具和库,能够帮助我们更高效地应对高并发场景。本文将介绍GO语言并发编程的基础知识和一些常用的并发编程技巧,...
    99+
    2023-11-05
    开发技术 编程算法 并发
  • go并发利器sync.Once如何使用
    这篇文章主要介绍了go并发利器sync.Once如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go并发利器sync.Once如何使用文章都会有所收获,下面我们一起来看看吧。1. 简介本文主要介绍 Go ...
    99+
    2023-07-05
  • 并发编程:Go语言和Shell/Bash的比较
    并发编程是计算机领域中一个重要的概念,它指的是在同一时间内执行多个任务的能力。随着计算机性能的提高和需求的增加,对并发编程的需求也越来越高。本文将比较Go语言和Shell/Bash在并发编程方面的异同点。 Go语言是一种由Google开发的...
    99+
    2023-09-30
    并发 shell bash
  • 如何在Go语言中实现并发编程?
    Go语言是一种现代化的编程语言,它的并发编程特性使其成为开发高性能网络应用和分布式系统的理想选择。本文将介绍Go语言中的并发编程,包括协程、通道和锁等重要概念,以及如何使用它们来实现高效的并发编程。 协程 协程是Go语言中并发编程的核心概...
    99+
    2023-06-21
    并发 ide npm
  • 使用Go语言开发高效的并发编程应用
    使用Go语言开发高效的并发编程应用随着互联网的快速发展和计算机性能的不断提升,人们对于软件系统的要求也越来越高。尤其是在网络应用开发中,高并发处理成为了一项重要的技术挑战。而Go语言作为一门强调并发编程的语言,逐渐成为了开发高效并发应用的首...
    99+
    2023-11-20
    Go语言 并发编程 高效应用
  • go语言如何并发
    这篇文章主要介绍“go语言如何并发”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go语言如何并发”文章能帮助大家解决问题。Go语言通过编译器运行时(runtime),从语言上支持了并发的特性;并发是...
    99+
    2023-07-05
  • go并发利器sync.Once使用示例详解
    目录1. 简介2. 基本使用2.1 基本定义2.2 使用方式2.3 使用例子3. 原理4. 使用注意事项4.1 不能将sync.Once作为函数局部变量4.2 不能在once.Do中...
    99+
    2023-03-14
    go并发sync.Once go sync.Once
  • Go语言中如何处理并发编程的问题
    在Go语言中,可以使用goroutine和channel来处理并发编程的问题。1. Goroutine:Goroutine是Go语言...
    99+
    2023-10-09
    Go语言
  • Go语言在Unix容器中的并发编程技巧
    随着云计算和容器技术的不断发展,Unix容器已经成为一种非常流行的虚拟化技术。在这个背景下,Go语言作为一种高效的并发编程语言,也成为了Unix容器中的一种重要编程语言。本文将介绍,并通过演示代码来帮助读者更好地理解这些技巧。 一、Go语...
    99+
    2023-10-09
    并发 unix 容器
  • Go语言的并发编程:如何使用Bash对象?
    Go语言自带的并发编程机制使得它成为一门非常适合处理高并发场景的语言。其中,Bash对象是Go语言中的一个重要组成部分,它可以帮助我们更加高效地进行并发编程。在本文中,我们将会介绍Bash对象的概念、用法以及一些实际案例。 一、Bash对象...
    99+
    2023-06-27
    并发 bash 对象
  • Go语言中的并发编程:同步机制详解
    在Go语言中,支持并发编程是其一个非常重要的特性。而并发编程中的同步机制也是非常重要的,它能够确保程序的正确性和稳定性。本文将详细介绍Go语言中的同步机制,并通过演示代码来加深理解。 互斥锁(Mutex) 互斥锁是Go语言中最基础的同...
    99+
    2023-08-23
    并发 同步 索引
  • 为什么要使用Go语言进行并发编程?
    随着计算机技术的不断进步,人们对并发编程的需求也越来越高。并发编程是指同时执行多个任务的能力,其优点是可以提高程序的性能和响应速度。在传统的编程语言中,如C++和Java,实现并发编程需要使用线程和锁等复杂的机制。而Go语言则提供了一种更...
    99+
    2023-07-27
    同步 并发 日志
  • Go语言和Shell/Bash:哪个更适合并发编程?
    随着计算机技术的发展,越来越多的应用需要并发编程来提高程序的效率和性能。而在并发编程中,选择合适的编程语言也是非常重要的。在本文中,我们将比较Go语言和Shell/Bash这两种编程语言在并发编程方面的优缺点,并从实际应用中演示代码,来帮...
    99+
    2023-09-30
    并发 shell bash
  • 并发编程的终极对决:Go语言 vs. Shell/Bash
    并发编程是当今计算机科学领域中的一个重要话题。它的目的是在同一时间内执行多个任务,从而提高程序的效率。在这个领域里,Go语言和Shell/Bash都是非常流行的编程语言。本文将会探讨这两种语言在并发编程方面的差异。 Go语言是一种开源的、...
    99+
    2023-09-30
    并发 shell bash
  • Go语言中如何处理并发编程的问题?
    Go语言中如何处理并发编程的问题?在当今的软件开发中,同时处理多个任务成为了一种常态。并发编程不仅能够提高程序的效率,还能更好地利用计算资源。然而,并发编程也会引入一些问题,例如竞态条件、死锁等。Go语言作为一门先进的编程语言,提供了一些强...
    99+
    2023-10-22
    并发 (concurrency) 互斥锁 (Mutex) 协程 (Goroutine)
  • 详解go语言的并发
    目录1、启动go语言的协程2、runtime.Goexit()方法。立即终止当前的协程3、runtime.GOMAXPROCS()表示go使用几个cpu执行代码4、管道定义和创...
    99+
    2022-06-07
    详解go语言 GO 并发 go语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作