關於執行緒安全的例子(電影票出售)
阿新 • • 發佈:2019-01-10
1 執行緒安全
如果有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。程式每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。
電影院售票的例子
電影院要賣票,我們模擬電影院的賣票過程。假設要播放的電影是 “功夫熊貓3”,本次電影的座位共100個(本場電影只能賣100張票)。
我們來模擬電影院的售票視窗,實現多個視窗同時賣 “功夫熊貓3”這場電影票(多個視窗一起賣這100張票)
需要視窗,採用執行緒物件來模擬;需要票,Runnable介面子類來模擬
模擬票
package com.oracle.demo01; publicclass Myticket implements Runnable { private int ticket=100; private Object obj=new Object(); public void run() { while(true){ if(ticket>0){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"出售第"+ticket--+"張票"); } } } }
測試類
package com.oracle.demo01; public class SaleTicket { public static void main(String[] args) { //建立執行緒任務 Myticket mt=new Myticket(); //建立執行緒 Thread t0=new Thread(mt); Thread t1=newThread(mt); Thread t2=new Thread(mt); //開啟執行緒 t0.start(); t1.start(); t2.start(); } }
執行結果為:
執行結果發現:上面程式出現了問題
票出現了重複的票
錯誤的票 0、-1
執行緒安全問題都是由全域性變數及靜態變數引起的。若每個執行緒中對全域性變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的;若有多個執行緒同時執行寫操作,一般都需要考慮執行緒同步,否則的話就可能影響執行緒安全