synchronized
是一个悲观锁的例子,认为线程并发严重,操作上锁,直到释放锁的时候别的线程才会释放资源。
CAS
操作是一个乐观锁的例子,不上锁,会不断尝试更新。
内存地址V,旧的预期值A,要修改的新值B。
CAS
操作有三个操作数 A(预期旧值) V(内存地址) B(修改后的新值)
拿 count = 10 自增做例子(真正的CAS操作需要把变量设置为volatile保证可见性)
线程A
内存地址 V = 0xxxxx;
A = 10;
B =11;
这个时候另外一个线程B操作的修改完了内存地址V的值为11
比较V的值和A不同
放弃这次操作,开始重试,获取内存地址V,更新
A=11;
B=12;
比较内存V的值和A相同,进行操作
缺点:
只能保证一个共享变量原子性。
长期更新不成功比较耗费资源。
ABA问题(可以使用AtomicStampedReference解决)
网友评论