并发编程体系-JUC思维导图

volatile:

对volatile的定义:Java允许线程访问共享变量,为了确保共享变量能被准确和一致性的更新,线程应该确保通过排它锁单独获得变量。如果一个变量被声明为volatile,Java内存模型确保所有线程读到这个变量的值是一致的。那如何保证呢,原理是JVM会向处理器发送一条LOCK指令,将这个变量所在的工作内存写会到主存。然后在多处理器下,为了保证每个线程的工作内存是一致的,就出现了缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己的变量是不是过期了,当发现变量对应的地址被修改了,就会重新从主存中读取变量。

CAS:

我们常说的乐观锁就是指CAS。这种乐观并发策略的实现不需要把线程挂起,因此这种操作也叫非阻塞同步。这种无锁方案比一般的直接加锁效率更高,原因是Java中线程的切换需要操作系统的内核来帮忙完成,需要用户态和内核态的相互转换,这种操作非常耗费处理器时间,比如对于synchronized同步的方法,线程上下文切换可能比代码执行的时间还要长。 但是这种方案也不完美,会存在下面三个问题,(1)ABA问题,也就是变量的值本来是A,改成了B,后来又变成了A。那么在使用CAS时就会发现没有变化,实际上是发生了变化,解决方法就是加入版本控制。JUC下面的atomic包中的AtomicStampedReference来解决这问题,但是这个类比较鸡肋。大部分情况下ABA问题不会影响代码的并发性。如果需要解决ABA问题,可以用互斥同步可能会比这个类更高效。(2)循环时间长开销大:自旋CAS如果长时间不成功,会给处理器带来很大的开销,所以如果长时间占用锁,就不适合用CAS。 (2)只能保证一个共享变量的原子操作。如果需要对多个变量操作,CAS就无法保证操作的原子性,这个时候只能用锁。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值