Java鎖 Lock實現原理 底層實現

2021-08-19 19:28:58 字數 1985 閱讀 6334

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...