昨天,路過的時候,發現了這個問題:
class syncclass
catch(exception e)
system.out.println(" ]");}}
class test implements runnable
public void run()
}
}
輸出結果如圖:
其實synchronized void synmthd(string s)
system.out.println("[ "+s);
try{
thread.sleep(3000);
catch(exception e)
system.out.println(e);
system.out.println(" ]");
**塊確實被鎖住了,但是在thread的run方法中建立了物件syncclass syn = new syncclass();
因為run這個方法或當前物件沒有被鎖住,也就是說t1和t2兩個執行緒,分別執行run的時候,建立了兩個物件,因為syncclass的class類沒有被鎖住,
所以同時建立了兩個物件,當執行緒t2在呼叫synmthd(string s)的時候輸出 [ t2 ,還沒有往
下走的時候,另外乙個執行緒也執行到了這裡,並且呼叫了另外乙個物件的該**塊同一時間輸出了[ t1,這樣就造成synchronized不起作用的結果。
如果在run中鎖定this,也就是test的class類或著修改成:
public void run() {
syncclass syn = new syncclass();
thread th = thread.currentthread();
synchronized (syn.getclass()) {
syn.synmthd(th.getname());
的使用都可以阻塞下乙個執行緒實現同步的。
乙個經典的多執行緒同步問題
本篇文章參考了 程式描述 主線程啟動10個子執行緒並將表示子線程式號的變數位址作為引數傳遞給子執行緒。子執行緒接收引數 sleep 50 全域性變數 sleep 0 輸出引數和全域性變數。要求 1 子執行緒輸出的線程式號不能重複。2 全域性變數的輸出必須遞增。下面畫了個簡單的示意圖 分析下這個問題的...
乙個經典的多執行緒同步問題 問題引入
下面來看乙個經典的多執行緒的同步和互斥的問題,問題的描述 主線程啟動10個子執行緒並將表示子線程式號的變數的位址作為引數傳遞給子執行緒。子執行緒接收引數 sleep 50 全域性變數 sleep 0 輸出引數和全域性變數。要求 1.子執行緒輸出的線程式號不能重複 2.全域性變數的輸出必須是遞增的 下...
乙個經典的多執行緒同步問題01 問題重現
程式描述 主線程啟動10個子執行緒並將表示子線程式號的變數位址作為引數傳遞給子執行緒。子執行緒接收引數 sleep 50 全域性變數 sleep 50 輸出引數和全域性變數。要求 1 子執行緒輸出的線程式號不能重複。2 全域性變數的輸出必須遞增。下面畫了個簡單的示意圖 分析下這個問題的考察點,主要考...