CAS、锁

CAS

cas是无锁操作,他是对更新内容进行比较,如果内存中的值和实际值不相等(也就是说在它更改之前其他线程已经更改了)就会重新更新操作。
CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去重试更新。
CAS的缺点:

1) CPU开销过大

在并发量比较高的情况下,如果许多线程反复尝试更新某一个变量,却又一直更新不成功,循环往复,会给CPU带来很到的压力。

2) 不能保证代码块的原子性

CAS机制所保证的知识一个变量的原子性操作,而不能保证整个代码块的原子性。比如需要保证3个变量共同进行原子性的更新,就不得不使用synchronized了。

3) ABA问题
就是有两个线程获取到了资源X,他们都是想把X变成A,但是其中一个线程被阻塞了,另一个成功运行,
这时又来了一个线程把X的值还原了,导致最后被阻塞的线程又可以成功将X变成了A。可是这个操作是不应该执行的。
这是CAS机制最大的问题所在。
解决方法:加上版本号version。

1、为了保证高并发下变量的正确性,我们可以使用synchronized来加锁。
但synchronized属于悲观锁,悲观的认为程序中的并发情况严重,所以严防死守,他的效率会低很多。
2、我们还可以使用atomic 就不用自己加锁了。

AtomicInteger count=new AtomicInteger(0);
count.incrementAndGet();//count++;

atomic 使用的是无锁操作,即前面说的cas操作,由于不加锁,所以效率“一般”会比synchronized高。

3、LongAdder 在线程非常多时效率会更高,它是使用了分段锁

可重用锁
synchronized就是可重用的,在synchronized方法里可调用另外一个加同一个锁的方法。
ReentrantLock 设置参数为true时表示公平锁,不能抢占

等待线程结束 CountDownLatch 类
CountDownLatch latch=new CountDownLatch (count);

latch.countDown(); //count–;

latch.await(); //等待线程运行结束,即count为0时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值