鎖是個非常有用的工具,運用場景非常多,因為它使用起來非常簡單,而且易於理解。但同時它也會帶來一些困擾,那就是可能會引起死鎖,一旦產生死鎖,就會造成系統功能不可用。
1.系統資源不足
2.進行執行推進的順序不合適
3.資源分配不當
如果系統資源充足,程序的資源請求都能得到滿足,死鎖出現的可能性就很低,否則就會因為爭奪有限的資源而陷入死鎖。其次,其次,程序執行推進順序與速度不同,也可能產生死鎖。
1.互斥條件:乙個資源每次只能被乙個程序使用
2.請求與保持條件:乙個程序因請求資源而阻塞時,對已獲得的資源保持不放
3.不剝奪條件:程序已獲得的資源,在未使用完之前,不能強行剝奪
4.迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係
這4個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立。上述條件若有乙個不滿足,則不會發生死鎖。
以下這段**就會引起死鎖,執行緒t1和執行緒t2相互等待對方釋放鎖。
public class deadlockdemo catch (interruptedexception e)
synchronized (b)}}
});thread t2 = new thread(new runnable() }}
});t1.start();
t2.start();
}public static void main(string args)
}
執行結果:
產生了死鎖,執行緒t1和執行緒t2相互等待對方釋放鎖。
這段**只是演示死鎖的場景,在現實中我們可能不會寫出這樣的**。但是,在一些更為複雜的場景中,我們可能會遇到這樣的問題:比如t1拿到鎖之後,因為一些異常沒有釋放鎖(死迴圈)。又或者是t1拿到乙個資料庫鎖,釋放鎖的時候丟擲了異常,沒釋放掉。一旦出現死鎖,業務是可感知的,因為不能繼續提供服務了。
避免死鎖的幾個常見方法:
1.避免乙個執行緒同時獲取多個鎖。
2.避免乙個執行緒在鎖內同時占用多個資源,盡量保證每個鎖只占用乙個資源。
3.嘗試使用定時鎖,使用lock.trylock(timeout)來代替使用內部鎖機制。
4.對於資料庫鎖,加鎖和解鎖必須在用乙個資料連線裡,否則會出現解鎖失效的情況。
死鎖以及避免死鎖
目錄 一 什麼是死鎖 二 產生死鎖的四個必要條件 三 避免死鎖的方法 是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。1.互斥 某種資源一次只允...
死鎖的避免
什麼是死鎖,如何避免死鎖?執行緒a需要資源x,而執行緒b需要資源y,而雙方都掌握有對方所要的資源,這種情況稱為死鎖 deadlock 或死亡擁抱 the deadly embrace 在併發程式設計中,死鎖 deadlock 是一種十分常見的邏輯錯誤。通過採用正確的程式設計方式,死鎖的發生不難避免。...
死鎖 死鎖的預防和避免
死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。由死鎖的定義可知,死鎖主要是由於競爭資源引起的,那麼這裡的資源指的是哪些資源呢?系統中的資源...