1. 程式人生 > >關於執行緒安全的例子(電影票出售)

關於執行緒安全的例子(電影票出售)

1 執行緒安全

 

如果有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。程式每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。

電影院售票的例子

電影院要賣票,我們模擬電影院的賣票過程。假設要播放的電影是 “功夫熊貓3”,本次電影的座位共100個(本場電影只能賣100張票)。

我們來模擬電影院的售票視窗,實現多個視窗同時賣 “功夫熊貓3”這場電影票(多個視窗一起賣這100張票)

需要視窗,採用執行緒物件來模擬;需要票,Runnable介面子類來模擬

模擬票

package com.oracle.demo01;

public
class 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=new
Thread(mt); Thread t2=new Thread(mt); //開啟執行緒 t0.start(); t1.start(); t2.start(); } }

執行結果為:

 

 

執行結果發現:上面程式出現了問題

  票出現了重複的票

  錯誤的票 0、-1

執行緒安全問題都是由全域性變數及靜態變數引起的。若每個執行緒中對全域性變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的;若有多個執行緒同時執行寫操作,一般都需要考慮執行緒同步,否則的話就可能影響執行緒安全