一個面試問題,大意如下:
一個類中兩個synchronized方法甲和乙,當一個線程進入方法甲時,乙可以進入方法乙嗎?
我發現我還真沒注意過這個問題,搜索了下也沒找到官方文檔明確的提及這個問題,於是寫了些代碼做試驗。
package com.*.automation.synchronize;
import java.util.concurrent.TimeUnit;
public class RWManager {
public synchronized void write() throws InterruptedException{
System.out.println("Write begin");
TimeUnit.SECONDS.sleep(5);
System.out.println("Write done.");
}
public synchronized void read() throws InterruptedException
{
while(true){
System.out.println("Read run");
TimeUnit.SECONDS.sleep(1);
}
}
public static void main(String args[]){
RWManager rw = new RWManager();
new ThreadDemo(rw, true).start();
new ThreadDemo(rw, false).start();
}
}
該類是提供兩個synchronized方法,一個在進入時打印:開始,然後睡眠15秒,然後退出並打印:結束;另一個每秒鐘打錢一個:我運行了。
package com.*.automation.synchronize;
public class ThreadDemo extends Thread {
private boolean flag;
private RWManager rw;
public ThreadDemo(RWManager rw, boolean flag){
this.flag = flag;
this.rw = rw;
}
@Override
public void run(){
if(flag){
try {
rw.write();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else{
try {
rw.read();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
運行結果是:
Write begin
Write done.
Read run
Read run
Read run
Read run
Read run
方法乙需等待方法甲運行結束才會運行,故答案是:不可以進入。
測試環境:Win7+Java8