Java多線程模擬售票程序和線程安全問題
Java中線程部分知識(shí)中,售票程序非常經(jīng)典。程序中也有一些問題存在!
需求:模擬3個(gè)窗口同時(shí)在售100張票。
問題1:為什么100張票被賣出了300張票?
原因:因?yàn)閠ickets是非靜態(tài)的,非靜態(tài)的成員變量數(shù)據(jù)是在每個(gè)對(duì)象中都會(huì)維護(hù)一份數(shù)據(jù)的,三個(gè)線程對(duì)象就會(huì)有三份。
解決方案:把tickets票數(shù)共享出來給三個(gè)線程對(duì)象使用。使用static修飾。
問題2: 出現(xiàn)了線程安全問題 ?
線程安全問題的解決方案:sun提供了線程同步機(jī)制讓我們解決這類問題的。
java線程同步機(jī)制的方式:
方式一:同步代碼塊
方式二:同步函數(shù)
class SellTickets extends Thread{ static int tickets=1;//票數(shù) 這里 必須定義為static。不然 非靜態(tài)的成員變量,非靜態(tài)的成員變量數(shù)據(jù)是在每個(gè)對(duì)象中都會(huì)維護(hù)一份數(shù)據(jù)的。三個(gè)線程對(duì)象就會(huì)有三份。 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+"號(hào)票"); tickets++; /* if(tickets==101){ //錯(cuò)誤的。當(dāng)ticket==101時(shí),只跳出一個(gè)線程。其它兩個(gè)線程還存在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)建三個(gè)線程對(duì)象,模擬三個(gè)窗口 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ù)源的實(shí)例(MongoDB主從)
下面小編就為大家分享一篇springboot配置多數(shù)據(jù)源的實(shí)例(MongoDB主從),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12Java實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建類操作示例
這篇文章主要介紹了Java實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建類操作,結(jié)合完整示例形式分析了Java動(dòng)態(tài)創(chuàng)建類的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2020-02-02Java組件commons fileupload實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了Java組件commons fileupload實(shí)現(xiàn)文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10Junit單元測(cè)試關(guān)于@Transactional注解引起的事務(wù)回滾問題
這篇文章主要介紹了Junit單元測(cè)試關(guān)于@Transactional注解引起的事務(wù)回滾問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08SpringSecurity多表多端賬戶登錄的實(shí)現(xiàn)
本文主要介紹了SpringSecurity多表多端賬戶登錄的實(shí)現(xiàn)2024-05-05如何通過Java實(shí)現(xiàn)加密、解密Word文檔
這篇文章主要介紹了如何通過Java實(shí)現(xiàn)加密、解密Word文檔,對(duì)一些重要文檔,常需要對(duì)文件進(jìn)行加密,查看文件時(shí),需要正確輸入密碼才能打開文件。下面介紹了一種比較簡(jiǎn)單的方法給Word文件加密以及如何給已加密的Word文件解除密碼保護(hù),需要的朋友可以參考下2019-07-07Spring Boot 通過AOP和自定義注解實(shí)現(xiàn)權(quán)限控制的方法
這篇文章主要介紹了Spring Boot 通過AOP和自定義注解實(shí)現(xiàn)權(quán)限控制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Java的常見熱門ORM框架優(yōu)缺點(diǎn)區(qū)別
Java?ORM框架是一種用于將Java對(duì)象映射到關(guān)系型數(shù)據(jù)庫中的工具,使得開發(fā)人員能夠通過對(duì)象操作數(shù)據(jù)庫而不必直接使用SQL查詢,Java開發(fā)變得更加高效和易于維護(hù),選擇適合你的ORM框架是根據(jù)你的需求決定的,比如你的應(yīng)用場(chǎng)景,數(shù)據(jù)結(jié)構(gòu)和技術(shù)水平等2024-02-02