手機版 網站建設 網站設計 網站開發 網站制作 16年專業品質
  • 微信
    微信二維碼
  • 微博
  • 商城

Java多線程之-死鎖

作者:admin  發布時間:2020-07-27 14:10:14

所謂線程死鎖是指兩個或兩個以上的線程互相持有對方所需要的資源,由于synchronized的特性,一個線程持有一個資源,或者說獲得一個鎖,在該線程釋放這個鎖之前,其它線程是獲取不到這個鎖的,而且會一直死等下去,因此這便造成了死鎖。


如下圖(1-1):



Java多線程中死鎖產生的必要條件如下:

  1.互斥條件:一個資源,或者說一個鎖只能被一個線程所占用,當一個線程首先獲取到這個鎖之后,

在該線程釋放這個鎖之前,其它線程均是無法獲取到這個鎖的;

  2.占有且等待:一個線程已經獲取到一個鎖,再獲取另一個鎖的過程中,即使獲取不到也不會釋放已

經獲得的鎖;

  3.不可剝奪條件:任何一個線程都無法強制獲取別的線程已經占有的鎖;

  4.循環等待條件:線程A拿著線程B的鎖,線程B拿著線程A的鎖;

當滿足以上四個條件時,就出現死鎖的情況!!!


public class DeadLock implements  Runnable {
    //創建兩個鎖對象
    private Object lock1=new Object();
    private Object lock2=new Object();

    @Override
    public void run(){
        while(true){
            method1();
            method2();
        }
    }
    public void method1(){
        synchronized (lock1){
            System.out.println(Thread.currentThread().getName() + “獲取到lock1”);
            try {
                Thread.sleep(1000);  //線程休眠,使得CPU切換
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (lock2){
                System.out.println(Thread.currentThread().getName() + "獲取到lock2");
            }
        }
    }
    public void method2(){
        synchronized (lock2){
            System.out.println(Thread.currentThread().getName() + "獲取到lock2");
            synchronized (lock1){
                System.out.println(Thread.currentThread().getName() + "獲取到lock1");
            }
        }
    }

    public static void main(String[] args) {
        DeadLock deadLock = new DeadLock();
        new Thread(deadLock).start();
        new Thread(deadLock).start();
    }



這樣便造成了死鎖,Thread1拿著lock1,想要lock2,Thread2拿著lock2,想要lock1.  


Java多線程中如何避免死鎖:


  1.加鎖順序:線程按照相同的順序加鎖。


  2.加鎖時限,線程獲取鎖的過程中限制一定的時間,如果給定時間內獲取不到,就算了,別勉強自

己。這需要用到Lock的一些API


在發生死鎖之后,程序就卡住了沒有任何反應,但程序仍在運行,因此需要借助一些

  1.首先使用 jps -l 顯示正在運行的虛擬機進程,并顯示虛擬機執行主類(main函數所在

的類)名稱以及這些進程的本地虛擬機唯一ID



  2.使用 jstack + id 進行跟蹤排查

 


上一篇: MySql數據庫優化方案 下一篇: IDEA常用插件簡單安裝步驟詳解
返回列表
16年專業品質
互聯網品牌推廣專家
專業的建站、人機交互策劃、高端UI設計、移動應用開發公司
業務電話:020/22373839    15915747484
業務QQ:641589319
業務QQ:1375530069
廣州總部地址:廣東省廣州市越秀區先烈中路69號東山廣場2904室 郵編:510111
海極網絡微信二維碼
澳门百家乐代理_Welcome