天天看點

同步函數以this為同步對象

1. /*
2.     同步函數用的是this鎖
3.     
4.     函數需要被對象調用。那麼函數都有一個所屬對象調用,就是this
5.     是以同步函數使用的鎖是this
6. 
7.     
8.     通過該程式進行驗證
9. 
10.     使用兩個線程來賣票
11. 
12.     一個線程在同步代碼塊中
13.     一個線程在同步函數中
14.     都在執行賣票操作
15. 
16. 
17. */  
18.   
19. class Ticket implements Runnable  
20. {  
21. private int tick = 1000;  
22.       
23. //Object obj = new Object();  
24.   
25. boolean flag = true;  
26.   
27. public void run()  
28.     {  
29. if(flag)//第一個進入的線程實行下面代碼  
30.         {  
31. while(true)  
32.                 {  
33. //synchronized(obj)//由于同步函數的是以this對象為鎖的 此處如果使用obj對象作為鎖  
34. //則不能實作同步 輸出的資料會出現錯誤 程式的安全性不能得到保證  
35. synchronized(this)//和下面的show函數使用同樣的鎖 可以保證同步  
36.                     {  
37. if(tick>0)  
38.                         {  
39. try{Thread.sleep(40);}catch(Exception e){}  
40. " .....code..."+ tick--);  
41.   
42.                         }  
43.                     }  
44.                 }  
45. //第二個進入的代碼實行下面代碼  
46. else  
47. while(true)  
48. //this.show();  
49.       
50.     }  
51. public synchronized void show()//同步函數 以this為鎖  
52.     {  
53. if(tick>0)  
54.         {  
55. try{Thread.sleep(40);}catch(Exception e){}  
56. " .....show..."+ tick--);  
57.         }         
58.     }  
59.   
60. }  
61.   
62.   
63. class ThisLockDemo  
64. {  
65. public static void main(String []args)  
66.     {  
67. new Ticket();  
68. new Thread(t);  
69. new Thread(t);  
70.       
71. //開啟第一個線程  但不一定馬上執行  
72.           
73. false;//改變标志  
74. try{Thread.sleep(40);}catch(Exception e){}//讓主線程睡眠40毫秒  保證第一個線程先開始運作 且标志位改變  
75.   
76.         t2.start();   
77.     }  
78. }