Java之synchronized可重入性的理解


1  synchronized可重入性的理解

當一個線程試圖操作一個由其他線程持有的對象鎖的臨界資源時,將會處于阻塞狀態,但當一個線程再次請求自己持有對象鎖的臨界資源時,如果當前鎖是重入性,會請求將會成功,如果當前鎖不是可重入性,會等待當前對象鎖的釋放,實際上該對象鎖已被當前線程所持有,不可能再次獲得,就會產生死鎖,在java中synchronized是基于原子性的內部鎖機制,是可重入的,因此在一個線程調用synchronized方法的同時在其方法體內部調用該對象另一個synchronized方法,也就是說一個線程得到一個對象鎖后再次請求該對象鎖,是允許的,還有就是當子類繼承父類時,子類也是可以通過可重入鎖調用父類的同步方法,這就是synchronized的可重入性。

2  測試synchronized方法調用synchronized方法

1)代碼

    import java.io.*;
     
     
    class Parent    {
        public synchronized void willDo()    {
            System.out.println("我是父類的方法");
        }
    }
     
     
    class Child extends Parent {
     
        @Override
        public synchronized void willDo() {
            super.willDo();
            System.out.println("我是子類方法");
        }
     
        public static void main(String[] args) {
            Child child = new Child();
            child.willDo();
        }
    }


2)運行結果

    我是父類的方法
    我是子類方法

3 測試子類synchronized方法調用父類synchronized方法

1)代碼

    class Test implements Runnable    {
        static Test instance = new Test();
        static int i=0;
        static int j=0;
        @Override
        public void run() {
            for(int j = 0; j < 10; j++) {
     
                //當前實例對象鎖
                synchronized(this){
                    i++;
                    willDo();
                }
            }
        }
     
        public synchronized void willDo()    {
            j++;
        }
     
        public static void main (String[] args) throws java.lang.Exception    {
            Thread t1 = new Thread(instance);
            t1.start();
            t1.join();
            System.out.println(i);
        }
    }

 

2)運行結果

10


作者:chen.yu
深信服三年半工作經驗,目前就職游戲廠商,希望能和大家交流和學習,
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎入門進階人工智能(鏈接)