java的鎖機制
阿新 • • 發佈:2021-01-03
1.什麼是死鎖
執行緒死鎖描述的是這樣一種情況:多個執行緒同時被阻塞,它們中的一個或者全部都在等待某個資源被釋放。由於執行緒被無限期地阻塞,因此程式不可能正常終止。
public class DeadLockDemo { private static Object resource1 = new Object();//資源 1 private static Object resource2 = new Object();//資源 2 public static void main(String[] args) { new Thread(() -> { synchronized (resource1) { System.out.println(Thread.currentThread() + "get resource1"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread() + "waiting get resource2"); synchronized (resource2) { System.out.println(Thread.currentThread() + "get resource2"); } } }, "執行緒 1").start(); new Thread(() -> { synchronized (resource2) { System.out.println(Thread.currentThread() + "get resource2"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread() + "waiting get resource1"); synchronized (resource1) { System.out.println(Thread.currentThread() + "get resource1"); } } }, "執行緒 2").start(); } }
死鎖產生的四個條件:
- 互斥條件:該資源任意一個時刻只由一個執行緒佔用。
- 請求與保持條件:一個程序因請求資源而阻塞時,對已獲得的資源保持不放。
- 不剝奪條件:執行緒已獲得的資源在末使用完之前不能被其他執行緒強行剝奪,只有自己使用完畢後才釋放資源。
- 迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。
避免死鎖的幾個常見方法:
1.避免一個執行緒同時獲得多個鎖
2.避免一個執行緒在鎖內佔多個資源,儘量保證一個鎖只佔用一個資源
3.嘗試使用定時鎖,使用lock.tryLock(timeout)來替代內部鎖的機制
4.對於資料庫鎖,加鎖和解鎖必須在一個數據庫連線中,否則會出現解鎖失敗的場景