一、CAS
CAS:就是把内存中的一个属性,从oldValue,替换为newValue。保证原子性。
核心逻辑方法:compareAndSwapInt(this,offset,expected,x)
this:当前对象
offset:偏移量
expected:期望值
x: 修改值
工作原理:主内存中的value值,用expected值与主内存中的value值比较,相等就修改。不相等获取内存中value值,继续循环修改直至成功。无锁操作,修改失败就失败了。
JUC(java.util.concurrent)的atomic包中AtomicInteger、AtomicLong、AtomicBoolean底层应用CAS实现。解决ABA问题,AtomicStampedReference通过reference标记来实现(类似版本号)。
二、AQS
AQS:线程同步框架,JUC包下的基类AbstractQueuedSynchronizer,没有具体的方法实现。JUC包下的类或多或少都继承了AQS。
比如:ReentrantLock、RennTrantReadWriteLock、CountDownLatch、CyclicBarrier、Semaphore等。
AQS主要有下面3个参数组成
state:0空闲,1被占用
head(单项链表):共享或互斥、waitStatus、thread、prev、next
tail(单项链表):共享或互斥、waitStatus、thread、prev、next
执行逻辑:
1、如果现在有A、B两个线程来抢锁,谁能把state置位1谁就会获取这把锁。
2、如果A获得了这把锁,B就会构建Node放入阻塞队列。
3、刚开始head和tail链表都指向null,B线程会构建Node(互斥、waitStatus=0,thread=B,prev指向head,next指向tail),tail指向Node(B)。head的waitStatus=1,证明后面有人挂起。
4、此时如果C线程来了,首先它会去尝试一下抢锁,尝试几次失败加入阻塞队列,过程和B相似。