標籤:java 多線程 線程死結
java多線程之線程死結
產生死結的主要原因:
- 因為系統資源不足。
- 進程運行推進的順序不合適。
- 資源分派不當等。
如果系統資源充足,進程的資源請求都能夠得到滿足,死結出現的可能性就很低,否則就會因爭奪有限的資源而陷入死結。其次,
進程運行推進順序與速度不同,也可能產生死結。
產生死結的四個必要條件:
- 互斥條件:一個資源每次只能被一個進程使用。
- 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
- 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
- 迴圈等待條件:若干進程之間形成一種頭尾相接的迴圈等待資源關係。
這四個條件是死結的必要條件,只要系統發生死結,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死結。
樣本:
package com.lock;public class Test implements Runnable {public int flag = 1;static Object obj1 = new Object(), obj2 = new Object();public void run() {System.out.println("flag= " + flag);if (flag == 1) {synchronized (obj1) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (obj2) {System.out.println("1");}}}if (flag == 0) {synchronized (obj2) {try {Thread.sleep(500);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}synchronized (obj1) {System.out.println("0");}}}}public static void main(String[] args) {Test td1 = new Test();Test td2 = new Test();td1.flag = 1;td2.flag = 0;Thread t1 = new Thread(td1);Thread t2 = new Thread(td2);t1.start();t2.start();}}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
java多線程之 ---- 線程死結