畢向東講解(摘)—7.多執行緒安全問題(同步函式的鎖this驗證)
package day6;
/**
* 同步程式碼塊和同步函式
* 對同步函式的鎖是否為this的驗證
*
* @author mzy
*
* 因為本身同步程式碼塊我們傳入的鎖物件是當前物件this
* 只要同步函式的鎖物件是this的話,那麼我們的賣票程式最後的實現就是執行緒安全的
*
* 這裡最後驗證就是安全的。
*/
publicclassTest1{
publicstaticvoidmain(String[]args){
Tickettk=newTicket();
Threadt1=newThread(tk);
Threadt2=newThread(tk);
t1.start();
try{
Thread.sleep(1);// 讓主執行緒sleep 10ms
// 這裡必須丟擲異常
}catch(Exceptione){
}
t2.start();
}
}
classTicketimplements Runnable{
privateintticket=100;
booleanflag=true;
publicvoidrun(){
if(flag){
while(true){
synchronized(this){// 將當期物件作為synchronized 的鎖
if(ticket>0){
System.out.println("同步程式碼塊"+Thread
ticket--;
}
}
}
}else{
while(true){
show();
}
}
}
privatesynchronizedvoidshow(){
if(ticket>0){
System.out.println("同步函式"+Thread.currentThread().getName()+"賣出第"+ticket+"張票");
ticket--;
}
}
}
最後驗證的結果得同步函式的鎖就是this