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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

問(wèn)題這是一段Java學(xué)習(xí)中的例程,四個(gè)車(chē)站分別搶票。但是無(wú)法實(shí)現(xiàn)線程安全。需求實(shí)現(xiàn)線程安全注釋saleT代表車(chē)站的類(lèi)靜態(tài)類(lèi)balance代表剩余的票數(shù)s1-s4分別代表四個(gè)車(chē)站我在能用sync修飾的地方都打上了sync,為什么還是無(wú)法實(shí)現(xiàn)線程安全?↓下面是代碼內(nèi)容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號(hào)");SaleTs2=newSaleT("2號(hào)");SaleTs3=newSaleT("3號(hào)");SaleTs4=newSaleT("4號(hào)");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ù)等于原來(lái)的票數(shù)減1balance.setB(balan);/*System.out.println(balan);balan=ti.b.getB();*/}inti=0;//記錄一下這玩意兒總共搶了多少?gòu)埰眕ublicsynchronizedvoidrun(){while(balance.getB()>0){pay();System.out.println("我是"+saleId+"我為自己代言"+"---還剩下"+balance.getB());i++;}System.out.println("我是"+saleId+"我搶了"+i);}}
查看完整描述

2 回答

?
UYOU

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊

synchronized關(guān)鍵字的底層實(shí)現(xiàn)是對(duì)象鎖,它是作用于某一個(gè)對(duì)象上的。對(duì)于一個(gè)以synchronized修飾的方法來(lái)說(shuō),如果它不是靜態(tài)方法,那么加鎖的對(duì)象就是本對(duì)象即this;如果它是靜態(tài)方法,那么加鎖的對(duì)象是這個(gè)類(lèi)的Class對(duì)象(可以用getClass()獲得)。在你的代碼中,s1、s2、s3和s4是四個(gè)不同的對(duì)象,因此有四把不同的鎖分別控制這四個(gè)對(duì)象的run()方法,這四個(gè)線程同時(shí)操作同一個(gè)靜態(tài)變量balance.b,四把鎖之間是互不影響的,因此這個(gè)代碼根本就沒(méi)有體現(xiàn)任何的線程安全。你應(yīng)該使用同一把鎖控制這四個(gè)線程對(duì)b的讀寫(xiě)過(guò)程,或者將b修改為原子類(lèi)型。
//使用同一把鎖,最簡(jiǎn)單的方式是將pay()改為靜態(tài)方法
staticsynchronizeddoublepay(){
doubled=Balance.getB();//類(lèi)名應(yīng)該大寫(xiě)
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("支付失敗,余額不足");
}
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-27
?
慕少森

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊

你同步啥了...synchronized方法鎖的是實(shí)例對(duì)象你4個(gè)對(duì)象每個(gè)對(duì)象一把鎖自己和自己搶鎖誰(shuí)都能進(jìn)去哪里同步了
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-27
  • 2 回答
  • 0 關(guān)注
  • 428 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)