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. }