新聞中心
Java中線(xiàn)程部分知識(shí)中,售票程序非常經(jīng)典。程序中也有一些問(wèn)題存在!
旅順口ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話(huà)聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作!
需求:模擬3個(gè)窗口同時(shí)在售100張票。
問(wèn)題1:為什么100張票被賣(mài)出了300張票?
原因:因?yàn)閠ickets是非靜態(tài)的,非靜態(tài)的成員變量數(shù)據(jù)是在每個(gè)對(duì)象中都會(huì)維護(hù)一份數(shù)據(jù)的,三個(gè)線(xiàn)程對(duì)象就會(huì)有三份。
解決方案:把tickets票數(shù)共享出來(lái)給三個(gè)線(xiàn)程對(duì)象使用。使用static修飾。
問(wèn)題2: 出現(xiàn)了線(xiàn)程安全問(wèn)題 ?
線(xiàn)程安全問(wèn)題的解決方案:sun提供了線(xiàn)程同步機(jī)制讓我們解決這類(lèi)問(wèn)題的。
java線(xiàn)程同步機(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è)線(xiàn)程對(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)賣(mài)完啦-_-..."); break; } System.out.println(Thread.currentThread().getName()+"賣(mài)了第"+tickets+"號(hào)票"); tickets++; /* if(tickets==101){ //錯(cuò)誤的。當(dāng)ticket==101時(shí),只跳出一個(gè)線(xiàn)程。其它兩個(gè)線(xiàn)程還存在tickets++。 break; } /* if(Thread.currentThread().getName().equals("窗口2")){ //窗口2最多只能賣(mài)一張票,就結(jié)束了 break; } */ } //System.out.println(Thread.currentThread().getName()+"鎖后..."); } } } public class Demo4 { public static void main(String[] args) { //創(chuàng)建三個(gè)線(xiàn)程對(duì)象,模擬三個(gè)窗口 SellTickets s1=new SellTickets("窗口1"); SellTickets s2=new SellTickets("窗口2"); SellTickets s3=new SellTickets("窗口3"); //開(kāi)啟線(xiàn)程售票 s1.start(); s2.start(); s3.start(); System.out.println("main方法..."); } }
網(wǎng)站題目:Java多線(xiàn)程模擬售票程序和線(xiàn)程安全問(wèn)題
文章地址:http://www.dlmjj.cn/article/ijjjpp.html