[面試題]sychronized關鍵字

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打印此方法

 

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