天天看點

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方法

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);
    }
}      

10