1. 程式人生 > >java基礎--24.多執行緒的應用--電影院賣票程式的實現

java基礎--24.多執行緒的應用--電影院賣票程式的實現

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>()); //執行緒安全