2.1.6synchronized鎖重入

關(guān)鍵字synchronized擁有鎖重入的功能,也就是在使用synchronized時,當(dāng)一個線程得到一個對象鎖后,再次請求此對象鎖時是可以再次得到該對象鎖的。這也證明在一個synchronized方法/塊的內(nèi)部調(diào)用本類的其他synchronized方法/塊時,是永遠(yuǎn)可以得到鎖的。

/**
 * @author wuyoushan
 * @date 2017/4/10.
 */
public class Service {

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

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

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

/**
 * MyThread線程測試
 * @author wuyoushan
 * @date 2017/3/21.
 */
public class MyThread extends Thread {

    @Override
    public void run() {
        Service service=new Service();
        service.service1();
    }
}

/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {
    public static void main(String[] args){
        MyThread thread=new MyThread();
        thread.start();
    }
}

程序的運(yùn)行結(jié)果:

service1
service2
service3

“可重入鎖”的概念是:自己可以再次獲取自己的內(nèi)部鎖。
比如有1條線程獲得了某個對象的鎖,此時這個對象鎖還沒有釋放,當(dāng)其再次想要獲取這個對象的鎖的時候還是可以獲取的,如果不可鎖重入的話,就會造成死鎖。

可重入鎖也支持在父子類繼承的環(huán)境中

/**
 * @author wuyoushan
 * @date 2017/4/11.
 */
public class Main {
    public int i=10;

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

    }
}

/**
 * @author wuyoushan
 * @date 2017/4/11.
 */
public class Sub extends Main {
    synchronized public void operateISubMethod(){
        try{
            while (i>0) {
                i--;
                System.out.println("sub print i="+i);
                Thread.sleep(100);
                this.operateMainMethod();
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

/**
 * MyThread線程測試
 * @author wuyoushan
 * @date 2017/3/21.
 */
public class MyThread extends Thread {

    @Override
    public void run() {
       Sub sub=new Sub();
        sub.operateISubMethod();
    }
}

/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {
    public static void main(String[] args){
        MyThread thread=new MyThread();
        thread.start();
    }
}

程序運(yùn)行結(jié)果為:

sub print i=9
main print i=8
sub print i=7
main print i=6
sub print i=5
main print i=4
sub print i=3
main print i=2
sub print i=1
main print i=0

此程序說明,當(dāng)存在父類繼承關(guān)系時,子類是完全可以通過“可重入鎖”調(diào)用父類的同步方法的。

摘選自 java多線程核心編程技術(shù)-2.1.6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,731評論 0 11
  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 2,244評論 0 14
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,366評論 11 349
  • 1、要培養(yǎng)做生意的意識,要會做生意,會營銷。 2、一天數(shù)、二功德、三風(fēng)水、四遺傳、五八字。。。。。 修正方寸地,留...
    智囊團(tuán)閱讀 177評論 0 0
  • 每一份堅(jiān)持 都是成功的累積 只要相信自己 總會遇到驚喜 每一種生活 都有各自的軌跡 記得肯定自己 不要輕言放棄 每...
    快樂中姐閱讀 128評論 0 0