公平鎖與非公平鎖源碼對比
阿新 • • 發佈:2017-11-26
exc 方式 native 非公平鎖 false 隊列 其它 釋放 null
語義:
1.公平鎖:每個線程在獲取鎖的時候,會先檢查該鎖維護的等待隊列,如果該隊列是空或者當前線程是第一個,則占有鎖,否則按照FIFO的原則,進入等待隊列,等待獲取鎖;
2.非公平鎖:當前線程在獲取鎖的時候,不管該鎖的維護隊列種是否有其它等待線程,直接CAS,如果cas失敗,則再執行公平鎖的那一套;
源碼比較如下:
公平鎖:
final void lock() { acquire(1); }
非公平鎖:
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); returntrue; } return false; }
關於公平鎖與非公平鎖的更底層的一些東西,比如volatile的使用,因為涉及到native方法,暫時沒有深究。
公平鎖與非公平鎖源碼對比