1. 程式人生 > >畢向東講解(摘)—7.多執行緒安全問題(同步函式的鎖this驗證)

畢向東講解(摘)—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

.currentThread().getName()+"賣出第"+ticket+"張票");

ticket--;

}

}

}

}else{

while(true){

show();

}

}

}

privatesynchronizedvoidshow(){

if(ticket>0){

System.out.println("同步函式"+Thread.currentThread().getName()+"賣出第"+ticket+"張票");

ticket--;

}

}

}

最後驗證的結果得同步函式的鎖就是this