多线程与高并发基础总结-cas longadder

cas 无锁优化
atomic 下都是 通过cas 来保证线程安全的
cas 就是 一个值 操作的时候 会去判断我希望改变的值的结果 和出来的值是不是一致的 如果一致 通过 如果不一致 则失败

上代码

public class AtomicTest  {
    public static void main(String[] args) {
        AtomicInteger atomicInteger=new AtomicInteger(3);
        boolean b=  atomicInteger.weakCompareAndSet(3,1);
        System.out.println(atomicInteger+"b:"+b);
        }
}

我们进去看一下源码

  public final boolean weakCompareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

这里的unsafe是直接操作底层的
可以看出 其实有一个预期值expect 结果是
在这里插入图片描述

当然要考虑ABA 就是一个程序更改了这个值 又改了回来 主要是考虑引用类型 可以对其加入版本号 或者时间戳进行跟踪

longadder 这个进行了分段锁 这个跟1.7的concurrenthashmap 我理解结构有点像。对数进行了分段锁 最后放到数组里进行一起显示
听说 其效率比AtomicInteger 更高
【参考】volatile 解决多线程内存不可见问题。对于一写多读,是可以解决变量同步问题,但是如果多写,同样无法解决线程安全问题。
说明:如果是 count++ 操作,使用如下类实现:AtomicInteger count = new AtomicInteger(); count.addAndGet(1); 如果是 JDK8,推荐使用 LongAdder 对象,比 AtomicLong 性能更好(减少乐观 锁的重试次数)。

这个以后要深入研究 写出一个文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值