管理對共享資源的存取對於在並發程式設計中確保資料一致性非常重要。傳統的synchronized關鍵字對於公平性、立即獲取鎖定、等待特定時間獲取鎖等複雜場景缺乏彈性。 Java 1.5中引入了Lock、ReadWriteLock和StampedLock API來解決這些限制,並為開發人員提供了很好的控制來處理共享資源存取。它們是 java.util.concurrent 套件的一部分。
Lock API 是一個接口,提供以下方法來處理線程同步。
可重入鎖
ReentrantLock lock = new ReentrantLock(true); //fair lock public void methodExecution() { lock.lock(); try { // Critical section here } finally { lock.unlock(); } }
ReadWriteLock API 是一個接口,維護一對鎖來維護讀寫場景。如果沒有寫入者,讀鎖可以由多個執行緒同時持有。寫鎖是獨佔的。
關鍵規則
範例:在微服務通訊中,假設服務 B 需要來自服務 A 的 JWT。 JWT 由服務 A 生成,並且可以快取幾分鐘。在這種情況下ReentrantReadWriteLock會比較有用。如果令牌過期或即將過期,我們可以更新令牌。我在這裡不獲取讀鎖以避免讀飢餓。
ReentrantLock lock = new ReentrantLock(true); //fair lock public void methodExecution() { lock.lock(); try { // Critical section here } finally { lock.unlock(); } }
StampedLock 是在 Java 8 中引入的,它是一個類別。它支援三種鎖定模式並傳回用於釋放鎖定的標記。它允許鎖升級。
重點:
String jwt = JwtUtil.generateJwt(); ReadWriteLock lock = new ReentrantReadWriteLock(); Lock writeLock = lock.writeLock(); Lock readLock = lock.readLock(); public String getJwt(String key, String value) { if (StringUtils.hasLength(jwt)) { if (JwtUtil.isJwtEligibleToRenew(jwt)) { generateJwt(); } } else { generateJwt(); } return this.jwt; } public void generateJwt() { this.writeLock.lock(); //write lock try { if (JwtUtil.isJwtEligibleToRenew(jwt)) { this.jwt = JwtUtil.generateJwt(); } } finally { this.writeLock.unlock(); //release write lock } }
樂觀的閱讀範例。這允許執行緒在不獲取傳統讀鎖的情況下進行讀取,從而避免了鎖爭用,從而提高了效能。如果在取得樂觀讀鎖時間後取得了任何寫鎖,validate() 將會傳回 false,否則傳回 true。
public void readAndWrite() { long l = this.stampedLock.readLock(); try { //critical section } finally { this.stampedLock.unlock(l); } long w = this.stampedLock.writeLock(); try { //critical section } finally { this.stampedLock.unlock(w); } }
快樂編碼和學習! ! !
如有任何問題請留言。
以上是java中Lock API概述的詳細內容。更多資訊請關注PHP中文網其他相關文章!