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鎖的對象實例起作用