原理
1.CPU原语操作
2.cas(v,Expected e,newValue) ,其中,v:更改的值,e:更改前希望的值,newValue:要更改成的值
3.内部使用了unsafe
基于CAS的锁
1.lock锁,实现-ReentrantLock, ReentrantLock底层是AQS(AbstractQueuedSynchronizer),AQS的底层是CAS
2.ReadWriteLock 读写锁,方法: writeLock 写锁,readLock读锁
3.AtomicXXX类 java提供的内部自带锁的操作,在java.util.concurrent.atomic路径下
4.LongAdder 内部使用了分段锁,线程数特别多的时候,效率高
5.AbstractQueuedSynchronized --AQS(CLH) 使用cas操作,代替了之前的锁操作,volatile state 双向链表,node节点,node节点里面是 thread
unsate c源码,操作线程
CAS问题
特性:cas的操作,是cpu指令级别的操作,中间无法被打断,cpu原语支持
CAS会有ABA问题,解决ABA问题:1.加version,2.加时间戳,3.使用AtomicStampedReference-compareAndSet解决ABA问题(原理等同于加版本号),4.AtomicMarkableReference (原理等同于加版本号)