static synchronized方法和synchronized方法的區別和聯繫-2(class鎖和對象鎖,不同鎖,混合訪問時)

package com.ljf.mianshi.demo.mainshithread;
public class TestJd {
    public static void main(String args[]){
        JDSB jdsb=new JDSB();
        JDSB jdsb2=new JDSB();
        new Thread(new ThreadA(jdsb),"A").start();
        new Thread(new ThreadB(jdsb),"B").start();
    }
}

package com.ljf.mianshi.demo.mainshithread;
public class JDSB {
    public static synchronized void   sayA() {
        System.out.println("我是線程:"+Thread.currentThread().getName()+"我開始執行sayA");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("我是線程:"+Thread.currentThread().getName()+"我離開sayA");
    }
    public   synchronized  void sayB(){
        System.out.println("我是線程:"+Thread.currentThread().getName()+"我開始執行sayB");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("我是線程:"+Thread.currentThread().getName()+"我離開sayB");
    }
}
package com.ljf.mianshi.demo.mainshithread;
public class ThreadA implements Runnable {
    JDSB jdsb=null;
    public ThreadA(JDSB jdsb) {
        this.jdsb=jdsb;
    }

    @Override
    public void run() {
        jdsb.sayA();
    }
}
package com.ljf.mianshi.demo.mainshithread;
public class ThreadB implements Runnable {
    JDSB jdsb=null;
    public ThreadB(JDSB jdsb) {
        this.jdsb=jdsb;
    }

    @Override
    public void run() {
        jdsb.sayB();
    }
}

結果:

我是線程:A我開始執行sayA
我是線程:B我開始執行sayB
我是線程:A我離開sayA
我是線程:B我離開sayB

結論:

異步原因是持有不同的鎖,一個是對象鎖,另外一個是Class鎖,Class鎖可以對所有持有class鎖的對象實例起作用

https://www.cnblogs.com/moruoxuan/p/9671959.html

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