
- Hazelcast 教程
- Hazelcast - 首頁
- Hazelcast - 簡介
- Hazelcast - 設定
- Hazelcast - 第一個應用程式
- Hazelcast - 配置
- 設定多節點例項
- Hazelcast - 資料結構
- Hazelcast - 客戶端
- Hazelcast - 序列化
- Hazelcast 高階
- Hazelcast - Spring 整合
- Hazelcast - 監控
- Map Reduce 和聚合
- Hazelcast - 集合監聽器
- 常見陷阱和效能提示
- Hazelcast 有用資源
- Hazelcast - 快速指南
- Hazelcast - 有用資源
- Hazelcast - 討論
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() 檢查鎖是否已被其他執行緒獲取 |