高端手机网站 制作公司微信公众平台登录入口官网
news/
2025/9/24 7:03:33/
文章来源:
高端手机网站 制作公司,微信公众平台登录入口官网,wordpress的x站模板,WordPress同步某个表Go基础之锁的初识 当我们的程序就一个线程的时候是不需要用到锁的#xff0c;但是通常我们实际的代码不会是单个线程的#xff0c;所有这个时候就需要用到锁了#xff0c;那么关于锁的使用场景主要涉及到哪些呢#xff1f; 当我们多个线程在读相同的数据的时候则是需要加锁…Go基础之锁的初识 当我们的程序就一个线程的时候是不需要用到锁的但是通常我们实际的代码不会是单个线程的所有这个时候就需要用到锁了那么关于锁的使用场景主要涉及到哪些呢 当我们多个线程在读相同的数据的时候则是需要加锁的当我们的程序既有读又有写的时候更是需要加锁的当我们有多个线程在写的时候同样也是需要加锁互斥锁 互斥锁同一个时刻只有一个线程能够拿到锁 我们先通过一个例子来演示如果当多个线程同时更改一个变量结果会是怎么样不加锁版本 package mainimport (syncfmt
)var (//lock sync.Mutexcount intw sync.WaitGroup //用于等待子线程执行完之后退出
)func main() {w.Add(1) // 在调用线程前执行w.addgo func(){for i:0;i100000;i{count}w.Done() //执行完 执行w.Done}()for i :0;i100000;i{count}w.Wait() // 最后执行w.wait等待所有的线程执行完毕fmt.Println(count)} 当我们运行多次就可以发现最后的结果基本不可能是我们先看到的200000我们修改代码代码需要加锁保护的地方加上锁并且这里加的是互斥锁修改后的代码为 package mainimport (syncfmt
)var (lock sync.Mutexcount intw sync.WaitGroup //用于等待子线程执行完之后退出
)func main() {w.Add(1) // 在调用线程前执行w.addgo func(){for i:0;i100000;i{lock.Lock()countlock.Unlock()}w.Done() //执行完 执行w.Done}()for i :0;i100000;i{lock.Lock()countlock.Unlock()}w.Wait() // 最后执行w.wait等待所有的线程执行完毕fmt.Println(count)} 这次当我们多次运行的时候就能保证我们每次都能看到我们想要的值200000接下来看读写锁 读写锁 读写锁主要用到读多写少的场景读写锁分为读锁和写锁 如果自己设置了一个写锁那么其他读的线程以及写的线程都拿不到锁这个时候和互斥锁的功能相同如果自己设置了一个读锁那么其他写的线程是拿不到锁的但是其他读的线程都是可以拿到这个锁 我们把上面的例子代码进行更改 package mainimport (syncfmt
) var (rwlock sync.RWMutexw sync.WaitGroupcount int
)func main() {w.Add(1)go func(){for i:0;i1000000;i{rwlock.Lock() // 这里定义了一个写锁countrwlock.Unlock()}w.Done()}()for i:0;i1000000;i{rwlock.Lock() // 这里定义了一个写锁countrwlock.Unlock()}w.Wait()fmt.Println(count)
} 通过设置写锁我们同样可以实现数据的一致性下面是一个读锁的使用例子 package mainimport (syncfmt
)var (rwlock sync.RWMutexw sync.WaitGroupcount int
)func main() {w.Add(1)go func(){for i:0;i1000000;i{rwlock.Lock() // 这里定义了一个写锁countrwlock.Unlock()}w.Done()}()for i:0;i16;i{w.Add(1)go func(){rwlock.RLock() //这里定义了一个读锁fmt.Println(count)rwlock.RUnlock() //释放读锁w.Done()}()}w.Wait()fmt.Println(count)
} Go中的原子操作 原子操作我们则不需加锁也能保证数据的一致性并且如果只是计算那么原子操作则是最快的 实例代码 package mainimport (sync//timesync/atomicfmt
)var (w sync.WaitGroupcount int32
)func main() {w.Add(1)//start : time.Now().UnixNano()go func() {for i:0;i1000000;i{atomic.AddInt32(count,1)}w.Done()}()for i:0;i1000000;i{atomic.AddInt32(count,1)}w.Wait()//end : time.Now().UnixNano()//fmt.Println((end- start)/1000/1000)fmt.Println(count)
} 所有的努力都值得期许每一份梦想都应该灌溉 转载于:https://www.cnblogs.com/flying1819/articles/8832749.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/915147.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!