static abstract class sync extends abstractqueuedsynchronizer
final static class nonfairsync extends sync
final static class fairsync extends sync
final boolean nonfairtryacquire(int acquires)
} else if (current == getexclusiveownerthread())
return false;
}
如果c !=0 但發現自己已經擁有鎖,只是簡單地++acquires,並修改status值,但因為沒有競爭,所以通過setstatus修改,而非cas,也就是說這段**實現了偏向鎖的功能,並且實現的非常漂亮。
private node addwaiter(node mode)
} enq(node);
return node;
}
private node enq(final node node)
} else
} }
}
cancelled(1):因為超時或中斷,該執行緒已經被取消
condition(-2):表明該執行緒被處於條件佇列,就是因為呼叫了condition.await而被阻塞
propagate(-3):傳播共享鎖
0:0代表無狀態
final boolean acquirequeued(final node node, int arg)
if (shouldparkafte***iledacquire(p, node) &&
parkandcheckinterrupt())
interrupted = true;
} } catch (runtimeexception ex)
}
private final boolean parkandcheckinterrupt()
private static boolean shouldparkafte***iledacquire(node pred, node node) while (pred.waitstatus > 0);
pred.next = node;
} else
return false;
}
規則2:如果前繼節點狀態為cancelled(ws>0),說明前置節點已經被放棄,則回溯到乙個非取消的前繼節點,返回false,acquirequeued方法的無限迴圈將遞迴呼叫該方法,直至規則1返回true,導致執行緒阻塞
規則3:如果前繼節點狀態為非signal、非cancelled,則設定前繼的狀態為signal,返回false後進入acquirequeued的無限迴圈,與規則2同
至此,鎖住執行緒的邏輯已經完成,下面討論解鎖的過程。
public final boolean release(int arg)
return false;
}
protected final boolean tryrelease(int releases)
setstate(c);
return free;
}
private void unparksuccessor(node node)
if (s != null)
locksupport.unpark(s.thread);
}
synchronized底層實現原理及鎖優化
一 概述 1 synchronized作用 原子性 synchronized保證語句塊內操作是原子的 可見性 synchronized保證可見性 通過 在執行unlock之前,必須先把此變數同步回主記憶體 實現 有序性 synchronized保證有序性 通過 乙個變數在同一時刻只允許一條執行緒對其...
java集合底層實現原理
底層使用陣列實現 該集合是可變長度陣列,陣列擴容時,會將老陣列中的元素重新拷貝乙份到新的陣列中,每次陣列容量增長大約是其容量的1.5倍,這種操作的代價很高。採用了fail fast機制,面對併發的修改時,迭代器很快就會完全失敗,而不是冒著在將來某個不確定時間發生任意不確定行為的風險 remove方法...
鎖的底層原理
那麼golang中加鎖加了什麼?1 禁止編譯器做優化 優化遮蔽 2 禁止cpu進行指令重排 記憶體遮蔽 3 針對快取行和記憶體匯流排的控制 4 衝突時的任務等待佇列。常見鎖總結 自旋鎖 只要沒有鎖上,就不斷重試。如果別的執行緒長期持有該鎖,那麼你這個執行緒就一直在 while while while...