【面试:并发篇31:多线程:cas】无锁实现并发
00.前言
如果有任何问题请指出,感谢。
01.介绍
cas
cas可以实现无锁并发,无阻塞并发。
cas与synchronized对比
CAS 是基于乐观锁的思想:最乐观的估计,不怕别的线程来修改共享变量,就算改了也没关系,我吃亏点再重试。
synchronized 是基于悲观锁的思想:最悲观的估计,得防着其它线程来修改共享变量,我上了锁你们都别想改,我改完了解开锁,你们才有机会。
02.例子
例子介绍
我们创建一个账户 可以取账户里的钱 现在账户里有10000,每次取10块,我们创建1000个线程 每个线程都执行一次取钱操作,如果没有线程安全的情况下 最后账户的余额应该是0,但是我们知道一定会有线程安全问题,所以我们用synchronized与cas分别实现它,最后来分析cas为什么要这样处理。
代码
public class TestAccount {
public static void main(String[] args) {
Account account = new AccountCas(10000);
Account.demo(account); // cas实现
AccountUnsafe account1 = new AccountUnsafe(10000);
Account.demo(account1); // synchronized实现
}
}
class AccountCas implements Account {
private AtomicInteger balance;
public AccountCas(int balance) {
this.balance = new AtomicInteger(balance);