Java之synchronized可重入性的理解


1  synchronized可重入性的理解

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

2  測試synchronized方法調(diào)用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)運行結(jié)果

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

3 測試子類synchronized方法調(diào)用父類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++) {
     
                //當(dāng)前實例對象鎖
                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)運行結(jié)果

10


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