1. 程式人生 > 其它 >樂觀鎖、悲觀鎖和公平、非公平

樂觀鎖、悲觀鎖和公平、非公平

技術標籤:javajava

今天心情:我是一個程式設計師,現在已經走向了逼不得已通過寫文章賺取流量來謀生的道路。可是現在流量慘淡,可是我並不驚慌。奧裡給。

詳細內容連結地址: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;
  }