2020久久超碰欧美精品最新亚洲欧美日韩久久精品,国产福利电影一区二区三区,亚洲欧美日韩一区在线观看,亚洲国产欧美日韩欧美特级,亚洲欧美日韩成人一区久久,欧美日韩精品一区二区三区不卡,国产欧美日韩va另类影音先锋,亚洲欧美日韩久久精品,亚洲欧美日韩国产成人精品影院,亚洲国产欧美日韩精品一区二区三区,欧美日韩国产成人高清视频,日韩久久精品国产免费观看频道,久久人人爽人人爽从片av高清,国产精品综合一区二区

首頁技術文章正文

如何保證多線程共享數據的安全?

更新時間:2021-03-17 來源:黑馬程序員 瀏覽量:

1577370495235_學IT就到黑馬程序員.gif


售票案例中,極有可能碰到“意外”情況,如一張票被打印多次,或者打印出的票號為0甚至負數。這些“意外”都是由多線程操作共享資源tickets所導致的線程安全問題,接下來對案例進行修改,模擬四個窗口出售10張票,并在售票的代碼中每次售票時線程休眠100毫秒,如文件1所示。

文件1 Example11.java

     // 定義SaleThread類實現Runnable接口
     class SaleThread implements Runnable {
         private int tickets = 10; // 10張票
         public void run() {
             while (true) {
                 if (tickets > 0) {
                     try {
                         Thread.sleep(100); // 模擬售票耗時過程
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
                     System.out.println(Thread.currentThread().getName()
                             + " 正在發售第 " + tickets-- + " 張票 ");
                 }
             }
         }
     }
     public class Example11 {
         public static void main(String[] args) {
             SaleThread saleThread = new SaleThread();
             // 創建并開啟四個線程,模擬4個售票窗口
             new Thread(saleThread, "窗口1").start();
             new Thread(saleThread, "窗口2").start();
             new Thread(saleThread, "窗口3").start();
             new Thread(saleThread, "窗口4").start();
         }
     }


運行結果如圖1所示。

1615964261977_2.png

圖1 運行結果

圖1中,最后幾行打印售出的票為0和負數,這種現象是不應該出現的,因為在售票程序中做了判斷只有當票號大于0時才會進行售票。運行結果中之所以出現了負數的票號是因為多線程在售票時出現了安全問題。

在售票程序的while循環中添加了sleep()方法,這樣就模擬了售票過程中線程的延遲。由于線程有延遲,當票號減為1時,假設窗口2線程此時出售1號票,對票號進行判斷后,進入while循環,在售票之前通過sleep()方法模擬售票時耗時操作,這時窗口1線程會進行售票,由于此時票號仍為1,因此窗口1線程也會進入循環,同理,四個線程都會進入while循環,休眠結束后,四個線程都會進行售票,這樣就相當于將票號減了四次,結果中出現了1、0、-1、-2這樣的票號。


猜你喜歡:

2021年黑馬Java學習線路圖發布【含免費自學視頻】

Java線程的生命周期及各種狀態轉換詳解

“Java一次編譯到處運行”是什么意思?

java高級軟件工程師課程

分享到:
在線咨詢 我要報名
和我們在線交談!