sleep會不會讓出鎖,帶着問題看實例二,不明白實例二是啥,請先看實力一this
package synchronize;線程
public class ThreadSleepTest implements Runnable{
int number = 10;
public void firstMethod() throws Exception {
synchronized (this) {
number += 100;
System.out.println(number);
}
}
/*咱們來大體分析一下此段代碼,main()方法中實例化ThreadTest並啓動該線程,而後調用該線程的一個方法(secondMethod()),由於在主線程中調用方法,
因此調用的普通方法secondMethod())會先被執行(但並非普通方法執行完畢該對象的線程方法才執行,普通方法執行過程當中,該線程的方法也會被執行,
他們是交替執行的,只是在主線程的普通方法會先被執行而已),因此程序運行時會先執行secondMethod(),
而secondMethod()方法代碼片斷中有synchronized block,所以secondMethod方法被執行後,該方法會佔有該對象機鎖致使該對象的線程方法一直處於阻塞狀態,
不能執行,直到secondeMethod釋放鎖;
使用Thread.sleep(2000)方法時,由於sleep在阻塞線程的同時,並持有該對象鎖,因此該對象的其餘同步線程(secondMethod())沒法執行,
直到synchronized block執行完畢(sleep休眠完畢),secondMethod()方法才能夠執行,所以輸出結果爲number*200+100;
使用this.wait(2000)方法時,secondMethod()方法被執行後也鎖定了該對象的機鎖,執行到this.wait(2000)時,該方法會休眠2S並釋當前持有的鎖,
此時該線程的同步方法會被執行(由於secondMethod持有的鎖,已經被wait()所釋放),所以輸出的結果爲:number+100;*/
public void secondMethod() throws Exception {
synchronized (this) {
/**
* (休息2S,阻塞線程)
* 以驗證當前線程對象的機鎖被佔用時,
* 是否被能夠訪問其餘同步代碼塊
*/
//Thread.sleep(2000);
this.wait(2000);
number *= 200;
System.out.println(number);
}
}
public void run() {
try {
firstMethod();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
ThreadSleepTest threadTest = new ThreadSleepTest();
Thread thread = new Thread(threadTest);
thread.start();
threadTest.secondMethod();
}
}
對象