第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在能同步的地方都已經(jīng)同步了,為什么還是發(fā)生線程污染?

在能同步的地方都已經(jīng)同步了,為什么還是發(fā)生線程污染?

尚方寶劍之說 2019-04-27 22:16:28
問題這是一段Java學習中的例程,四個車站分別搶票。但是無法實現(xiàn)線程安全。需求實現(xiàn)線程安全注釋saleT代表車站的類靜態(tài)類balance代表剩余的票數(shù)s1-s4分別代表四個車站我在能用sync修飾的地方都打上了sync,為什么還是無法實現(xiàn)線程安全?↓下面是代碼內容packagecom.hssgweb.多線程;//importjava.util.concurrent.locks.ReentrantLock;classbalance{staticdoubleb=1000;publicstaticdoublegetB(){returnb;}publicstaticvoidsetB(doubleb){balance.b=b;}}publicclass鐵路12306{publicstaticvoidmain(String[]args){//主方法SaleTs1=newSaleT("1號");SaleTs2=newSaleT("2號");SaleTs3=newSaleT("3號");SaleTs4=newSaleT("4號");Threadth1=newThread(s1);Threadth2=newThread(s2);Threadth3=newThread(s3);Threadth4=newThread(s4);th1.start();th2.start();th3.start();th4.start();}}classSaleTimplementsRunnable{//Locklock=newReentrantLock();StringsaleId;doublebalan;publicSaleT(StringsaleId){super();this.saleId=saleId;}synchronizedvoidpay(){//pay方法balan=balance.getB()-1;//剩余票數(shù)等于原來的票數(shù)減1balance.setB(balan);/*System.out.println(balan);balan=ti.b.getB();*/}inti=0;//記錄一下這玩意兒總共搶了多少張票publicsynchronizedvoidrun(){while(balance.getB()>0){pay();System.out.println("我是"+saleId+"我為自己代言"+"---還剩下"+balance.getB());i++;}System.out.println("我是"+saleId+"我搶了"+i);}}
查看完整描述

2 回答

?
UYOU

TA貢獻1878條經(jīng)驗 獲得超4個贊

synchronized關鍵字的底層實現(xiàn)是對象鎖,它是作用于某一個對象上的。對于一個以synchronized修飾的方法來說,如果它不是靜態(tài)方法,那么加鎖的對象就是本對象即this;如果它是靜態(tài)方法,那么加鎖的對象是這個類的Class對象(可以用getClass()獲得)。在你的代碼中,s1、s2、s3和s4是四個不同的對象,因此有四把不同的鎖分別控制這四個對象的run()方法,這四個線程同時操作同一個靜態(tài)變量balance.b,四把鎖之間是互不影響的,因此這個代碼根本就沒有體現(xiàn)任何的線程安全。你應該使用同一把鎖控制這四個線程對b的讀寫過程,或者將b修改為原子類型。
//使用同一把鎖,最簡單的方式是將pay()改為靜態(tài)方法
staticsynchronizeddoublepay(){
doubled=Balance.getB();//類名應該大寫
if(d>=1.0){
d-=1.0;
Balance.setB(d);
returnd;
}else{
return-1.0;
}
}
publicvoidrun(){
doubleb;
while((b=pay())>=0){
System.out.println(saleId+"支付成功,余額"+b);
}
System.out.println("支付失敗,余額不足");
}
                            
查看完整回答
反對 回復 2019-04-27
?
慕少森

TA貢獻2019條經(jīng)驗 獲得超9個贊

你同步啥了...synchronized方法鎖的是實例對象你4個對象每個對象一把鎖自己和自己搶鎖誰都能進去哪里同步了
                            
查看完整回答
反對 回復 2019-04-27
  • 2 回答
  • 0 關注
  • 427 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號