Java多線程可重入鎖例子解析

「可重入鎖」的概念是:本身能夠再次得到本身的內部鎖。好比有一條線程得到了某個對象的鎖,此時這個對象尚未釋放,當其再次想得到這個對象的鎖的時候仍是能夠得到的,若是不可鎖重入的話,就會形成死鎖。ide

class sysTest{
    synchronized void test1(String str){
        System.out.println(str+"1");
        test2(str);
        System.out.println("end" + str);
    }
    
    synchronized void test2(String str){
        System.out.println(str+"2");
    }
}

class myThread extends Thread{
    String str = null;
    public myThread(String str) {
        this.str = str;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        new sysTest().test1(str);
    }
}

public class synchronizedTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        myThread th1 = new myThread("1str");
        myThread th2 = new myThread("2str");
        th1.start();
        th2.start();
    }

}

 

在加粗的sychronized在的時候結果會有下面,結果不惟一的:this

1str1spa

2str1線程

1str2code

2str2對象

end2strblog

end1str同步

在加粗的sychronized去掉的時候結果會有下面,結果惟一的:class

1str1test

1str2

end1str

2str1

2str2

end2str

在這裏必需要認識到,加一個sychronized方法裏調用sychronized方法會形成不一樣步,須要注意。緣由是兩個鎖的問題,

這個時候使用可重入概念解決的話,就要使用對象鎖,由於在sychronized()代碼塊中再次得到該鎖就會能夠獲得: 

class sysTest{
    static Object object = new Object();
     void test1(String str){
         synchronized(object){
             System.out.println(str+"1");
                test2(str);
                System.out.println("end" + str);
         }
        
    }
    
    void test2(String str){
        synchronized(object){
        System.out.println(str+"2");
        }
    }
}

class myThread extends Thread{
    String str = null;
    public myThread(String str) {
        this.str = str;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        new sysTest().test1(str);
    }
}

public class synchronizedTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        myThread th1 = new myThread("1str");
        myThread th2 = new myThread("2str");
        th1.start();
        th2.start();
    }

}
結果:
1str1
1str2
end1str
2str1
2str2
end2str
相關文章
相關標籤/搜索