Java之synchronized可重入性的理解


1  synchronized可重入性的理解

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

2  測(cè)試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)運(yùn)行結(jié)果

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

3 測(cè)試子類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)前實(shí)例對(duì)象鎖
                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)運(yùn)行結(jié)果

10


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