语义:ui
1.公平锁:每一个线程在获取锁的时候,会先检查该锁维护的等待队列,若是该队列是空或者当前线程是第一个,则占有锁,不然按照FIFO的原则,进入等待队列,等待获取锁;spa
2.非公平锁:当前线程在获取锁的时候,无论该锁的维护队列种是否有其它等待线程,直接CAS,若是cas失败,则再执行公平锁的那一套;线程
源码比较以下:
公平锁:code
final void lock() { acquire(1); }
非公平锁:blog
final void lock() { if (compareAndSetState(0, 1)) //先尝试获取锁 setExclusiveOwnerThread(Thread.currentThread()); else acquire(1);//获取锁失败,再采用公平锁的方式; }
关于锁的释放,公平锁与非公平锁是同样的:队列
public final boolean release(int arg) { if (tryRelease(arg)) { Node h = head; if (h != null && h.waitStatus != 0) unparkSuccessor(h); return true; } return false; }
关于公平锁与非公平锁的更底层的一些东西,好比volatile的使用,由于涉及到native方法,暂时没有深究。源码