樂觀鎖、悲觀鎖和公平、非公平
阿新 • • 發佈:2021-01-22
今天心情:我是一個程式設計師,現在已經走向了逼不得已通過寫文章賺取流量來謀生的道路。可是現在流量慘淡,可是我並不驚慌。奧裡給。
詳細內容連結地址:https://zhuanlan.zhihu.com/p/345989476
如果內容有錯誤或者您有不同的見解,請關注我。想要思維導圖的小夥伴們記得留言哦。
樂觀鎖:獲取不到鎖,我就自旋,自旋就是while true,直到獲取到鎖為止。
悲觀鎖:獲取不到鎖,我就不要了。等著。
公平:判斷當前執行緒是是否第一個執行緒(就是我等的時間久了,因為第一個是最先放進佇列的),如果不是,就等著。如果是,就執行。
非公平:誰搶佔了,算誰的。與公平的區別就在於,我不判斷你是否是佇列中的第一個。
在程式碼實現上:主要是呼叫hasQueuedPredecessors()判斷當前執行緒是否是佇列的頭(公平的就判斷是否是第一個執行緒或者為空。不公平的就不判斷),然後如果獲取不到鎖,我是採用等待還是while(true)再嘗試一下呢?
(如果讓當前執行緒等待,他就是悲觀的,不思進取的。如果是while(true)(自旋),他就是樂觀的,積極向上的,心態比較好。)
/** 公平: * Sync object for fair locks * Acquires only if thread is first waiter or empty * 只有當執行緒是空或者是佇列中的第一個的時候才會獲取到鎖。hasQueuedPredecessors */ protected final boolean tryAcquire(int acquires) { if (getState() == 0 && !hasQueuedPredecessors() && compareAndSetState(0, acquires)) { setExclusiveOwnerThread(Thread.currentThread()); return true; } return false; } /** 不公平: * Acquire for non-reentrant cases after initialTryLock prescreen * 新來的執行緒隨便誰都可以獲取鎖,無論你是不是佇列中的第一個。區別:沒有hasQueuedPredecessors方法 */ protected final boolean tryAcquire(int acquires) { if (getState() == 0 && compareAndSetState(0, acquires)) { setExclusiveOwnerThread(Thread.currentThread()); return true; } return false; }