synchronized深入理解

synchronized
注意:在一個類中,不管有幾個方法進行了同步(synchronized),這些同步方法都共有一把鎖,只要一個線程獲得了這個對象鎖,其他的線程就不能訪問該對象的任何一個同步方法,但是可以訪問其他的非同步方法;
synchronized可重入機制:
即在一個 synchronized 方法/塊的內部調用本類的其他 synchronized 方法/塊時,是永遠可以得到鎖的;

synchronized實現任務的順序執行示例:

Main.java

package com.shunxu;

/**
 * @Auther: 13213
 * @Date: 2020/5/30 17:10
 * @Description:
 */
public class Main {
    synchronized public void serviceMethod(){
        try {
            System.out.println("init main 下一步 sleep begin ThreadName="+Thread.currentThread().getName()+" time="+System.currentTimeMillis());
            Thread.sleep(5000);
            System.out.println("init main 下一步 sleep end ThreadName="+Thread.currentThread().getName()+" time="+System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Sub.java

package com.shunxu;

/**
 * @Auther: 13213
 * @Date: 2020/5/30 17:15
 * @Description:
 */
public class Sub extends Main{
    @Override
    public void serviceMethod() {
        try {
            System.out.println("init sub 下一步 sleep begin ThreadName="+Thread.currentThread().getName()+" time="+System.currentTimeMillis());
            Thread.sleep(5000);
            System.out.println("init sub 下一步 sleep end ThreadName="+Thread.currentThread().getName()+" time="+System.currentTimeMillis());
            super.serviceMethod();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

MyThreadA,java

package com.shunxu;

/**
 * @Auther: 13213
 * @Date: 2020/5/30 17:17
 * @Description:
 */
public class MyThreadA extends Thread{
    private Sub sub;

    public MyThreadA(Sub sub) {
        super();
        this.sub = sub;
    }
    @Override
    public void run(){
        sub.serviceMethod();
    }
}

MyThreadB.java

package com.shunxu;

/**
 * @Auther: 13213
 * @Date: 2020/5/30 17:21
 * @Description:
 */
public class MyThreadB extends Thread{
    private Sub sub;

    public MyThreadB(Sub sub) {
        super();
        this.sub = sub;
    }
    @Override
    public void run(){
        sub.serviceMethod();
    }
}

Test.java

package com.shunxu;

/**
 * @Auther: 13213
 * @Date: 2020/5/30 17:22
 * @Description:
 */
public class Test {
    public static void main(String[] args) {
        Sub sub = new Sub();
        MyThreadA a = new MyThreadA(sub);
        a.setName("A");
        a.start();
        MyThreadB b = new MyThreadB(sub);
        b.setName("B");
        b.start();
    }
}

運行結果:

將子類中的方法加關鍵字synchronized進行同步後:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章