无锁算法

无锁算法

在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值