无锁算法

495 查看

无锁算法

在Java并发编程中,Java提供了很多并发编程工具类。在JUC包下有一个包叫atomic,下面所有的工具,我们都称为它是无锁算法的一种实现。

相对于有锁算法来说,无锁算法不会使等待线程休眠或者阻塞。它的具体原理是这样的:

比如有一个变量x,初始值为0

int x = 0

现在有两个线程A-ThreadB-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