1. 程式人生 > 其它 >java的鎖機制

java的鎖機制

技術標籤:Java多執行緒多執行緒java

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. 不剝奪條件:執行緒已獲得的資源在末使用完之前不能被其他執行緒強行剝奪,只有自己使用完畢後才釋放資源。
  4. 迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。

避免死鎖的幾個常見方法:

1.避免一個執行緒同時獲得多個鎖

2.避免一個執行緒在鎖內佔多個資源,儘量保證一個鎖只佔用一個資源

3.嘗試使用定時鎖,使用lock.tryLock(timeout)來替代內部鎖的機制

4.對於資料庫鎖,加鎖和解鎖必須在一個數據庫連線中,否則會出現解鎖失敗的場景