1.如何实现无锁并发?可以先看个例子,下面的例子会有线程安全的问题。
上面的例子是启动1000个线程,每个线程去减10,起始值为10000,正常情况最终余额为0,但是由于并发安全的问题,造成余额值为220。
2.解决方案
2.1) 在做减法时对代码块加锁
2.2) 可以通过无锁来实现
测试结果,第二条说明无锁是可以保证线程安全的,另外cas无锁方式比加syncronized更加高效。
3. cas无锁方式比syncronized加锁更高效的原因
cas不用发生阻塞,而syncronized会发生阻塞,因为阻塞是会发生线程的切换的,切换相对来说说是消耗性能的。
cas 是基于乐观锁的方式,乐观锁就是不怕别的线程来改,改不成功大不了再去进行重试
syncronized是基于悲观锁的方式,悲观锁是怕别的线程来更改,所以线程每次访问都得进行加锁,防止其他线程修改。
cas是基于无锁,无阻塞的方式
无锁体现在没有像syncronized那样有对应的monitor相关联,无阻塞体现在在发现更改不成功时,不用阻塞等待。
文章评论