Java 多執行緒賣票

2021-07-15 10:59:34 字數 1999 閱讀 3493

在實際應用中,我們經常用到多執行緒,如車站的售票系統,車站的各個售票口相當於各個執行緒。當我們做這個系統的時候可能會想到兩種方式來實現,繼承thread類或實現runnable介面,現在看一下這兩種方式實現的兩種結果。

class

mythread

extends

thread

public

void run() }}

}public

class

ticketsthread

}

執行結果:

繼承thread類的,我們相當於拿出三件事即三個賣票5張的任務分別分給三個視窗,他們各做各的事各賣各的票各完成各的任務,因為mythread繼承thread類,所以在new mythread的時候在建立三個物件的同時建立了三個執行緒;

}執行結果

實現runnable的, 相當於是拿出乙個賣票10張得任務給三個人去共同完成,new mythread1相當於建立乙個任務,然後例項化三個thread,建立三個執行緒即安排三個視窗去執行。

上面的兩種方式是實現多執行緒的基本方式,但是在執行的時候有的時候發現同一張票會賣2次,執行緒不安全,資料未同步。

多次跑會出現這種情況,還是執行緒不安全,思考一下,如果2 3視窗在還有1張被鎖住,等待完資源,此時資料已經髒了。

this.ticket這部操作,將ticket從主記憶體讀取到工作記憶體,2號 3號同時讀取了2個副本,因此可能出現不安全情況。

執行緒安全,資料正常。

1. 獲得同步鎖;

2. 清空工作記憶體;

3. 從主記憶體拷貝物件副本到工作記憶體;this.ticket到工作記憶體

4. 執行**(計算或者輸出等);

5. 重新整理主記憶體資料;

6. 釋放同步鎖。

所以使用synchronized ,鎖的位置很重要!!!

執行緒安全,資料正常。volatile

1. 將變數i從主記憶體拷貝到工作記憶體;

2. 改變i的值;

3. 重新整理主記憶體資料;

4. 將變數j從主記憶體拷貝到工作記憶體;

5. 改變j的值;

6. 重新整理主記憶體資料;

參考:

多執行緒賣票

前置條件 設定總票數 比如20張 開啟多個售票視窗同時進行火車票的售賣 這裡多個視窗代表 多執行緒.代表啟動了多少個執行緒物件 怎麼賣票 借助迴圈 重複賣票動作 使用 while死迴圈 每賣出1張 總票數 操作 什麼時候退出迴圈?發現賣完了,退出迴圈 開啟執行緒 執行 run方法內部邏輯 單執行緒賣...

Java 多執行緒模擬賣票示例

使用runnable介面建立三個子執行緒並起名為a,b,c模擬實現賣票操作,觀察結果。class mythread implements runnable塊 override public void run 方法2 sychronized方法 演算法 題目 海灘上有一堆桃子,五隻猴子來分。第一只猴子...

賣票 多執行緒模擬賣票系統

網上搶票,方便又高效,很舒服。應用多執行緒的同步執行可以模擬很多人搶票,而且不會發生衝突。下面,我們就來利用多執行緒來模擬一把。include include include int tickets 100 定義票數為全域性變數,所以執行緒都可訪問 pthread mutex t mutex 定義互...