Java中線程部分知識中,售票程序非常經(jīng)典。程序中也有一些問題存在!
旅順口ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
需求:模擬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方法..."); } }
當前題目:Java多線程模擬售票程序和線程安全問題
鏈接地址:http://jinyejixie.com/article38/ijjjpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、企業(yè)網(wǎng)站制作、手機網(wǎng)站建設(shè)、網(wǎng)站維護、網(wǎng)站設(shè)計、網(wǎng)站設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)