1. 程式人生 > >同步程式碼塊什麼時候釋放鎖

同步程式碼塊什麼時候釋放鎖

先來看這一段程式碼

public class ThreadDemo02 {
    private static String result;
    static String LOCK="LOCK";
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
result="hello";
System.out.println("run");
synchronized (LOCK) {
System.out.println("sysn");
LOCK.notify();//通知,但此時不釋放鎖,必須等程式碼塊執行結束
System.out.println("notify2");
}
}
}.start();
//while(result==null);
System.out.println("main");
synchronized (LOCK) {
System.out.println("mainsysn");
if(result==null){
System.out.println("wait+syn");
try{LOCK.wait();}catch(Exception e){}
}
}
System.out.println(
result.toUpperCase());
}
}

下面是一種執行結果:

main
run
mainsysn
sysn
HELLO
notify2

剛開始主執行緒搶到了CPU,於是列印了main,然後工作執行緒搶到了CPU,列印了run,然後主執行緒又搶到了CPU,進入LOCK方發鎖,列印了mainsysn,然後工作執行緒搶到了CPU,也進入LOCK方發鎖,列印了sysn,這是怎麼回事呢,主執行緒也沒執行wait方法,應該沒釋放鎖啊,為什麼工作執行緒能進入鎖呢?

這是我開始的一個疑問,其實是對什麼時候釋放鎖掌握的不全面,之前,我以為只有執行完wait或notify後才釋放鎖,其實還少了一種情況,就是該方法鎖中的程式碼全執行完了後也會釋放鎖。

如上,工作執行緒執行完run方法後,result有值了,那麼主執行緒中的程式碼塊就已經執行完了,儘管沒執行wait,但也釋放了方發鎖,所以工作執行緒才拿到了鎖