1問題描述:
假設有testA,testB方法在Syn類中,這兩個方法都被synchronized鎖住,問:線程A和線程B是否可以同時運行?
class Syn {
// 線程A進入testA(),線程A仍在執行
public synchronized void testA() {
}
// 線程B是否可以進入TestB()
public synchronized void testB () {
}
}
2分析:
可以給TestA()加一個死循環,使得線程A無限運行,TestB()加一條打印語句
1如果線程A運行,線程B被鎖住不運行,那麼沒有輸出
2如果兩個線程同時運行,那麼輸出線程B中的打印語句
3代碼:
package se.SE.practice;
class Syn {
// 線程1進入testA(),線程1仍在執行
public synchronized void testA() {
if (Thread.currentThread().getName().equals("A")) {
while (true) {
}
}
}
// 線程2是否可以進入TestB()
public synchronized void testB () {
if (Thread.currentThread().getName().equals("B")) {
System.out.println("線程B打印此方法");
}
}
}
class MyThread implements Runnable {
private Syn syn;
public MyThread (Syn syn){
this.syn=syn;
}
@Override
public void run() {
this.syn.testA();
this.syn.testB();
}
}
public class Thread1{
public static void main(String[] args) throws InterruptedException {
Syn syn=new Syn();
MyThread myThread=new MyThread(syn);
Thread thread=new Thread(myThread,"A");
Thread thread1=new Thread(myThread,"B");
thread.start();
Thread.sleep(2000);//爲了保證A先啓動,線程A啓動後進入休眠狀態
thread1.start();
}
}
結果:(沒有輸出)
爲了驗證以上觀點,我們對線程A解鎖---去掉TestA的synchronized
輸出:
線程B打印此方法