語義: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方法,暫時沒有深究。源碼