一、预备知识CAS

什么是CAS呢?compare and swap 比较和交换, CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。无论哪种情况,它都会在 CAS 指令之前返回该 位置的值;整个过程都是不可打断的,所以CAS是一个原子操作;主要是利用CPU的CAS指令,同时借助JNI来完成Java的非阻塞算法;

二、 公平锁非公平锁

非公平锁:加锁的时候直接去枪锁,不会管队列内是否有排队
公平锁:第一次加锁的时候不会去加锁,而是看队列内是否有人排队,如果有人排队,则进入队列(并不等于排队),然后并不死心,再次看一下我有没有资格去拿锁(前面的那个人是不是head),如果有资格(前面那个人是head)则继续拿锁,cg则执行同步块,失败则park(排队)。

三、关于公平锁和非公平锁的加锁流程和区别

好好看懂这幅图就懂了
Synchronized关键字分析二
这里有一个小问题:后关于synchronized是否公平锁?
synchronized是否公平锁得看线程在没有入队之前是否抢锁;入队之后就和公平不公平无关了;一朝排队;永远排队;

相关文章: