摘要:无锁算法在并发编程中,提供了很多并发编程工具类。在包下有一个包叫,下面所有的工具,我们都称为它是无锁算法的一种实现。相对于有锁算法来说,无锁算法不会使等待线程休眠或者阻塞。
无锁算法
在Java并发编程中,Java提供了很多并发编程工具类。在JUC包下有一个包叫atomic,下面所有的工具,我们都称为它是无锁算法的一种实现。
相对于有锁算法来说,无锁算法不会使等待线程休眠或者阻塞。它的具体原理是这样的:
比如有一个变量x,初始值为0
int x = 0
现在有两个线程A-Thread,B-Thread同时去修改变量 x,是x++,正确执行的情况下,x最后结果应该是2
利用无锁算法的实现是这样的
public final int incrementAndGet() { for (;;) { int current = get(); int next = current + 1; # compareAndSet会原子性的执行先判断current和内存中的值是否相等,如果不等就失败返回false if (compareAndSet(current, next)) return next; } }
在这个列子中,利用无锁算法,当线程需要重新设置变量的值时,都会携带当前值current和新值new去调用 `compareAndSet()` 方法,该方法在执行set操作会原子性的执行 先判断current和内存中的值是否相等,如果不等就失败返回false,否则就会把值设置为新值。
这个原子性的动作_先判断current和内存中的值是否相等,如果不等就失败返回false_的语句需要操作系统支持这种指令语句。所以incrementAndGet方法是一个原子性的操作方法
所以当A-Thread、B-Thread同时调用incrementAndGet去修改x值,x值的变化过程只会是
0->1->2
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/64653.html
摘要:测试吞吐量的时候,是通过每一种实现都重复测试超过次,每一次都运行秒以上,以保证系统足够预热,下面的结果都是第次之后平均每秒吞吐量。以我的经验看,教学和开发中的无锁算法,不仅能显著改善吞吐量同时他们也提供更低的延迟。 上周在由Heinz Kabutz通过JCrete 组织的开放空间会议(unconference)上,我参加一个新的java规范 JSR166 StampedLock 的审查...
摘要:在本例中,讲述的无锁来自于并发包我们将这个无锁的称为。在这里,我们使用二维数组来表示的内部存储,如下变量存放所有的内部元素。为什么使用二维数组去实现一个一维的呢这是为了将来进行动态扩展时可以更加方便。 我们已经比较完整得介绍了有关无锁的概念和使用方法。相对于有锁的方法,使用无锁的方式编程更加考验一个程序员的耐心和智力。但是,无锁带来的好处也是显而易见的,第一,在高并发的情况下,它比有锁...
摘要:整个包,按照功能可以大致划分如下锁框架原子类框架同步器框架集合框架执行器框架本系列将按上述顺序分析,分析所基于的源码为。后,根据一系列常见的多线程设计模式,设计了并发包,其中包下提供了一系列基础的锁工具,用以对等进行补充增强。 showImg(https://segmentfault.com/img/remote/1460000016012623); 本文首发于一世流云专栏:https...
摘要:因为多线程竞争锁时会引起上下文切换。减少线程的使用。举个例子如果说服务器的带宽只有,某个资源的下载速度是,系统启动个线程下载该资源并不会导致下载速度编程,所以在并发编程时,需要考虑这些资源的限制。 最近私下做一项目,一bug几日未解决,总惶恐。一日顿悟,bug不可怕,怕的是项目不存在bug,与其惧怕,何不与其刚正面。 系列文章传送门: Java多线程学习(一)Java多线程入门 Jav...
阅读 3061·2021-10-27 14:16
阅读 2877·2021-09-24 10:33
阅读 2284·2021-09-23 11:21
阅读 3228·2021-09-22 15:14
阅读 810·2019-08-30 15:55
阅读 1674·2019-08-30 15:53
阅读 1740·2019-08-29 11:14
阅读 2190·2019-08-28 18:11