欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java多線程模擬售票程序和線程安全問題

 更新時間:2018年05月20日 15:17:55   作者:syhleo  
本篇文章給大家分享了Java多線程模擬售票程序和線程安全問題的相關(guān)知識點,對此有興趣的朋友可以參考學(xué)習(xí)下。

Java中線程部分知識中,售票程序非常經(jīng)典。程序中也有一些問題存在!

需求:模擬3個窗口同時在售100張票。

問題1:為什么100張票被賣出了300張票?

原因:因為tickets是非靜態(tài)的,非靜態(tài)的成員變量數(shù)據(jù)是在每個對象中都會維護一份數(shù)據(jù)的,三個線程對象就會有三份。
解決方案:把tickets票數(shù)共享出來給三個線程對象使用。使用static修飾。

問題2: 出現(xiàn)了線程安全問題 ?

線程安全問題的解決方案:sun提供了線程同步機制讓我們解決這類問題的。

java線程同步機制的方式:

方式一:同步代碼塊

方式二:同步函數(shù)

class SellTickets extends Thread{ 
   
  static int tickets=1;//票數(shù) 這里 必須定義為static。不然  非靜態(tài)的成員變量,非靜態(tài)的成員變量數(shù)據(jù)是在每個對象中都會維護一份數(shù)據(jù)的。三個線程對象就會有三份。 
  public SellTickets(String threadName) { 
    super(threadName); 
  } 
  public void run() { 
    while(true){ 
      synchronized ("鎖") { 
        if(tickets==101){//或者 if(tickets>100){ 
          System.out.println("票已經(jīng)賣完啦-_-..."); 
          break; 
        } 
        System.out.println(Thread.currentThread().getName()+"賣了第"+tickets+"號票"); 
        tickets++; 
        /* 
        if(tickets==101){ //錯誤的。當ticket==101時,只跳出一個線程。其它兩個線程還存在tickets++。 
          break; 
        } 
        /* 
        if(Thread.currentThread().getName().equals("窗口2")){ //窗口2最多只能賣一張票,就結(jié)束了 
          break; 
        } 
        */ 
      } 
      //System.out.println(Thread.currentThread().getName()+"鎖后..."); 
       
    } 
     
  } 
} 
 
public class Demo4 { 
   
  public static void main(String[] args) { 
    //創(chuàng)建三個線程對象,模擬三個窗口 
    SellTickets s1=new SellTickets("窗口1"); 
    SellTickets s2=new SellTickets("窗口2"); 
    SellTickets s3=new SellTickets("窗口3"); 
    //開啟線程售票 
    s1.start(); 
    s2.start(); 
    s3.start(); 
     
    System.out.println("main方法..."); 
  } 
} 

相關(guān)文章

  • springboot配置多數(shù)據(jù)源的實例(MongoDB主從)

    springboot配置多數(shù)據(jù)源的實例(MongoDB主從)

    下面小編就為大家分享一篇springboot配置多數(shù)據(jù)源的實例(MongoDB主從),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Java實現(xiàn)動態(tài)創(chuàng)建類操作示例

    Java實現(xiàn)動態(tài)創(chuàng)建類操作示例

    這篇文章主要介紹了Java實現(xiàn)動態(tài)創(chuàng)建類操作,結(jié)合完整示例形式分析了Java動態(tài)創(chuàng)建類的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • Java組件commons fileupload實現(xiàn)文件上傳功能

    Java組件commons fileupload實現(xiàn)文件上傳功能

    這篇文章主要為大家詳細介紹了Java組件commons fileupload實現(xiàn)文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java躲不過設(shè)計模式的坑之代理模式詳解

    Java躲不過設(shè)計模式的坑之代理模式詳解

    設(shè)計模式看來更像是一種設(shè)計思維或設(shè)計思想,為你的項目工程提供方向,讓你的項目工程更加健壯、靈活,延續(xù)生命力。本文即將分享的是設(shè)計模式的其中一種:代理模式,感興趣的可以了解一下
    2022-09-09
  • Junit單元測試關(guān)于@Transactional注解引起的事務(wù)回滾問題

    Junit單元測試關(guān)于@Transactional注解引起的事務(wù)回滾問題

    這篇文章主要介紹了Junit單元測試關(guān)于@Transactional注解引起的事務(wù)回滾問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • SpringSecurity多表多端賬戶登錄的實現(xiàn)

    SpringSecurity多表多端賬戶登錄的實現(xiàn)

    本文主要介紹了SpringSecurity多表多端賬戶登錄的實現(xiàn)
    2024-05-05
  • 如何通過Java實現(xiàn)加密、解密Word文檔

    如何通過Java實現(xiàn)加密、解密Word文檔

    這篇文章主要介紹了如何通過Java實現(xiàn)加密、解密Word文檔,對一些重要文檔,常需要對文件進行加密,查看文件時,需要正確輸入密碼才能打開文件。下面介紹了一種比較簡單的方法給Word文件加密以及如何給已加密的Word文件解除密碼保護,需要的朋友可以參考下
    2019-07-07
  • java動態(tài)加載插件化編程詳解

    java動態(tài)加載插件化編程詳解

    這篇文章主要介紹了java動態(tài)加載插件化編程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • Spring Boot 通過AOP和自定義注解實現(xiàn)權(quán)限控制的方法

    Spring Boot 通過AOP和自定義注解實現(xiàn)權(quán)限控制的方法

    這篇文章主要介紹了Spring Boot 通過AOP和自定義注解實現(xiàn)權(quán)限控制,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Java的常見熱門ORM框架優(yōu)缺點區(qū)別

    Java的常見熱門ORM框架優(yōu)缺點區(qū)別

    Java?ORM框架是一種用于將Java對象映射到關(guān)系型數(shù)據(jù)庫中的工具,使得開發(fā)人員能夠通過對象操作數(shù)據(jù)庫而不必直接使用SQL查詢,Java開發(fā)變得更加高效和易于維護,選擇適合你的ORM框架是根據(jù)你的需求決定的,比如你的應(yīng)用場景,數(shù)據(jù)結(jié)構(gòu)和技術(shù)水平等
    2024-02-02

最新評論