无锁算法
在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,否则就会把值设置为新值。
所以当A-Thread、B-Thread同时调用incrementAndGet去修改x值,x值的变化过程只会是
0->1->2