JAVA 同步函式以this為鎖
阿新 • • 發佈:2019-01-22
//僅作為學習筆記
/* 同步函式用的是this鎖 函式需要被物件呼叫。那麼函式都有一個所屬物件呼叫,就是this 所以同步函式使用的鎖是this 通過該程式進行驗證 使用兩個執行緒來賣票 一個執行緒在同步程式碼塊中 一個執行緒在同步函式中 都在執行賣票操作 */ class Ticket implements Runnable { private int tick = 1000; //Object obj = new Object(); boolean flag = true; public void run() { if(flag)//第一個進入的執行緒實行下面程式碼 { while(true) { //synchronized(obj)//由於同步函式的是以this物件為鎖的 此處如果使用obj物件作為鎖 //則不能實現同步 輸出的資料會出現錯誤 程式的安全性不能得到保證 synchronized(this)//和下面的show函式使用同樣的鎖 可以保證同步 { if(tick>0) { try{Thread.sleep(40);}catch(Exception e){} System.out.println(Thread.currentThread().getName() +" .....code..."+ tick--); } } } }//第二個進入的程式碼實行下面程式碼 else while(true) show();//this.show(); } public synchronized void show()//同步函式 以this為鎖 { if(tick>0) { try{Thread.sleep(40);}catch(Exception e){} System.out.println(Thread.currentThread().getName() +" .....show..."+ tick--); } } } class ThisLockDemo { public static void main(String []args) { Ticket t = new Ticket(); Thread t1 = new Thread(t); Thread t2 = new Thread(t); t1.start();//開啟第一個執行緒 但不一定馬上執行 t.flag = false;//改變標誌 try{Thread.sleep(40);}catch(Exception e){}//讓主執行緒睡眠40毫秒 保證第一個執行緒先開始執行 且標誌位改變 t2.start(); } }