1,竞态的出现原因
竞态的产生是因为多个对象同时访问一个对象的时候就会产生。 最常见的例子是数据库。
在开发中多线程首先面对的问题就是如何竞争资源。
例子来源于网络,大致应该是:
vara =0funcrun(){fori :=0; i <1000; i++ {goadd()}time.Sleep(10* time.Minute)fmt.Println(a)}funcadd(){a++}
请允许我使用 time.Sleep() 来让主线程等待结果。其实也可以使用waitgroup来调度1000个协程的。
上面的例子可以得出的结果是不一定,如果1000个协程按照顺序进行处理的话结果应该是1000.
2, 要处理竞态,golang提供了一个库,sync 看名字就知道是和竞态有关系的。
Mutex 互斥锁
首先看下源码:
package syncimport("internal/race""sync/atomic""unsafe")functhrow(string)// provided by runtime// A Mutex is a mutual exclusion lock.// The zero value for a Mutex is an unlocked mutex.//// A Mutex must not be copied after first use.typeMutexstruct{state int32sema uint32}
第一句是 互斥锁就是互相排斥的锁。
第二句是 没有上锁的互斥锁的互斥量是0
第三句是 互斥锁一旦使用将不能被复制
这三句话也告诉了我们使用互斥锁的时候需要注意的几个点。
2,根据官方提供的 工具 进行处理竞态问题
回过头来继续解决刚才的竞态问题。我们产生的竞态其实主要是读取数据,如果不排队的话会产生脏读
var(a =0wg = sync.WaitGroup{}m = sync.Mutex{})funcRun(){fori :=0; i <1000; i++ {wg.Add(1)goadd()}wg.Wait()fmt.Println(a)}funcadd(){m.Lock()deferm.Unlock()a++wg.Done()}
经过Mutex的处理,我们得到的结果一定是1000.因为每次锁释放之后才会进行下一次调用。
切记锁一定要是公共的。不然达不到效果。也不能复制的。
GOLANG 的并发哲学:
Donotcommunicatethroughsharedmemory, butsharememorybycommunication.
不要通过共享内存来通信,而应该通过通信来共享内存
最后给大家一个思考:还记得sync库的开始吗?下面这句话。
functhrow(string)// provided by runtime
这句话是干嘛的?实现了什么功能呢?
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- @synchronized 互斥锁
- 自旋锁和互斥锁区别 --- 经典
- golang 互斥锁 sync.Mutex
- 互斥量与临界区的区别
- Golang学习笔记之互斥锁(Mutex)
- golang互斥锁的两种实现
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Text Processing in Python
David Mertz / Addison-Wesley Professional / 2003-6-12 / USD 54.99
Text Processing in Python describes techniques for manipulation of text using the Python programming language. At the broadest level, text processing is simply taking textual information and doing som......一起来看看 《Text Processing in Python》 这本书的介绍吧!