java基礎--24.多執行緒的應用--電影院賣票程式的實現
阿新 • • 發佈:2019-01-03
A.多執行緒應用–電影院賣票程式的實現
A:繼承Thread類
B:實現Runnable介面
電影院賣票程式出問題
為了更符合真實的場景,加入了休眠100毫秒。
多執行緒賣票過程中可能出現的問題:
a:同一張票多次出售
CPU的一次操作必須是原子性的
b:負數票
隨機性和延遲導致
多執行緒安全問題產生的原因(也是我們以後判斷一個程式是否有執行緒安全問題的依據)
A:是否有多執行緒環境 有!
B:是否有共享資料 有!
C:是否有多條語句操作共享資料 有!
B.同步解決執行緒安全問題
1.同步程式碼塊
synchronized (物件) {
需要被同步的程式碼;
}
這裡的鎖物件可以是任意物件,多個執行緒同時持有的必須是同一把鎖(同一個物件)。
2.同步方法
把同步加在方法上。
這裡的鎖物件是 this
3.靜態同步方法
把同步加在靜態方法上。
靜態方法的鎖物件是:當前類的位元組碼檔案物件
同步的特點
- 前提:多個執行緒
- 解決問題的時候需要注意:多個執行緒使用的是同一個鎖物件
- 同步的好處:同步的出現解決了多執行緒的安全問題
- 同步的弊端:當執行緒相當多時,因為每個執行緒都會去判斷同步上的鎖,這是很耗費資源的,無形中會降低程式的執行效率
回顧以前的執行緒安全的類
A:StringBuffer
B:Vector
C:Hashtable
執行緒安全的類,效率都比較低
D:如何把一個執行緒不安全的集合類變成一個執行緒安全的集合類?
用Collections工具類的方法即可。
舉例:
List<String> list1 = new ArrayList<String>(); //執行緒不安全
List<String> list2 = Collections
.synchronizedList(new ArrayList<String>()); //執行緒安全