无锁算法
在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