Synchronized可重入鎖通俗易懂的簡單分析

可重入鎖概念:this

當一個線程獲得一個對象鎖後,再次請求此對象時時能夠再次獲得該對象的鎖的,這也證實synchronized方法/塊的內部調用本類的其餘synchronized方法/塊時,時永遠能夠獲得鎖的。spa

public class Service {

    synchronized public void service1() {
        System.err.println("service1");
        service2();
    }

    synchronized public void service2() {
        System.err.println("service2");
        service3();
    }

    synchronized public void service3() {
        System.err.println("service3");

    }

}
public class SyncTest {
    public static void main(String[] args) {
        Service service = new Service();
        service.service1();
    }
}

輸出結果以下:線程

運行結果說明:code

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

可重入鎖也支持父子類繼承的環境中:blog

父類建立繼承

public class Main {

    public int i = 10;

    public synchronized void operateMainMethon() {
        try {
            i--;
            System.err.println("main print i=" + i);
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

子類建立進程

public class Sub extends Main {

    public synchronized void operateSubMethon() {
        try {
            while (i > 0) {
                i--;
                System.err.println("sub print i=" + i);
                Thread.sleep(100);
                this.operateMainMethon();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

結果以下:同步

 結果說明:io

當存在父子類進程關係時,子類時徹底能夠經過"可重入鎖"調用父類的同步方法的

相關文章
相關標籤/搜索