Hazelcast - ILock



java.util.concurrent.locks.Lock 提供了一個介面,可以在多執行緒環境中工作時實現並用於鎖定關鍵部分,在 JVM 中。

類似地,ILock 擴充套件了介面以提供 Java Lock 的分散式版本。它提供類似的功能:lock、unlock、tryLock

但是 ILock 和 Java Lock 之間的一個主要區別在於,Java Lock 提供了對來自單個 JVM 中執行緒的關鍵部分的保護,而 ILock 提供了對單個 JVM 中執行緒以及多個 JVM 中執行緒的同步。

ILock 只有一個同步備份,這意味著如果我們有一個設定,例如,我們有 5 個 JVM 正在執行,則只有兩個 JVM 將持有此變數。

讓我們看一個有用函式的示例。

獲取和釋放鎖

假設我們在兩個 JVM 上執行以下程式碼。

示例

public static void main(String... args) throws IOException, InterruptedException {
   //initialize hazelcast instance
   HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance();
   // create a lock
   ILock hzLock = hazelcast.getLock("lock_1");
   IAtomicLong counter = hazelcast.getAtomicLong("counter");
   // acquire lock
   hzLock.lock();
   System.out.println("Acquiring Lock");
   try{
      Thread.sleep(5000);
      System.out.println("Incrementing Counter");
      counter.incrementAndGet();
      System.out.println("Counter: " + counter.get());
   }
   finally {
      // release lock
      System.out.println("Lock Released");
      hzLock.unlock();
   }
   System.exit(0);
}

輸出

上述函式的輸出表明,第二個 JVM 只有在第一個 JVM 釋放鎖後才能獲取鎖。

Acquired Lock
Incrementing Counter
Counter: 1
Lock Released
Acquired Lock
Incrementing Counter
Counter: 2
Lock Released

使用 tryLock 代替 Lock

為了減少死鎖的可能性,建議使用 tryLock(timeout, unit) 方法而不是 lock()。預設情況下,lock() 的超時時間為 5 分鐘,如果在該時間段內未獲取鎖,則會丟擲 OperationTimeoutException 異常。tryLock 相反,根據在提供的時間段內是否獲取鎖返回布林值。

示例

讓我們在**兩個 JVM**上執行以下程式碼。

public static void main(String... args) throws IOException, InterruptedException {
   //initialize hazelcast instance
   HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance();
   // create a lock
   ILock hzLock = hazelcast.getLock("lock_1");
   // acquire lock
   if(hzLock.tryLock(2000, TimeUnit.SECONDS)) {
      System.out.println("Acquired Lock");
      Thread.sleep(5000);
      System.out.println("Lock Released");
      hzLock.unlock();
   }
   else
      System.out.println("Couldn't acquire lock");
      System.exit(0);
}

輸出

程式碼的**輸出**將是 -

Acquired Lock
Couldn't acquire lock
Lock Released

良好實踐和訣竅

  • 雖然獲取鎖非常有用,但建議將關鍵部分保持儘可能短。這確保了效能不會下降,並且還降低了死鎖的可能性。

  • 如果一個成員(已獲取)出現故障,則鎖會自動釋放,其他成員可以爭奪。

  • 該鎖是可重入的;它確保同一執行緒可以多次獲取鎖而不會導致死鎖。

有用方法

序號 函式名稱和描述
1

lock()

獲取提供的鎖例項,以便任何其他執行緒都無法獲取它。如果不可用,它會無限期地等待直到獲取鎖。

2

unlock()

釋放獲取的鎖

3

tryLock(long time, TimeUnit unit)

嘗試在給定的時間視窗內獲取鎖。如果獲取了鎖,則返回 true,否則返回 false。

4

isLocked()

檢查鎖是否已被其他執行緒獲取

hazelcast_data_structures.htm
廣告