版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第Java使用線程同步解決線程安全問題詳解作用:把出現(xiàn)線程安全的核心代碼上鎖
原理:每次只能一個(gè)線程進(jìn)入,執(zhí)行完畢后自行解鎖,其他線程才能進(jìn)來執(zhí)行
鎖對(duì)象要求:理論上,鎖對(duì)象只要對(duì)于當(dāng)前同時(shí)執(zhí)行的線程是同一個(gè)對(duì)象即可
缺點(diǎn):會(huì)干擾其他無關(guān)線程的執(zhí)行
所以,這種只是理論上的,了解即可,現(xiàn)實(shí)中并不會(huì)這樣用
publicclass多線程_4線程同步{
publicstaticvoidmain(String[]args){
//定義線程類,創(chuàng)建一個(gè)共享的賬戶對(duì)象
accounta=newaccount("abc",10000);
//創(chuàng)建兩個(gè)取錢的線程對(duì)象
newdrawthread(a,"小明").start();
newdrawthread(a,"小紅").start();
//取錢的線程類
classdrawthreadextendsThread{
//接收處理的賬戶對(duì)象
privateaccountacc;
publicdrawthread(accountacc,Stringname){
super(name);
this.acc=acc;
publicvoidrun(){
//取錢
acc.drawmoney(10000);
classaccount{
privateStringcartId;
privatedoublemoney;//賬戶余額
publicaccount(){
publicaccount(StringcartId,doublemoney){
this.cartId=cartId;
this.money=money;
publicStringgetCartId(){
returncartId;
publicvoidsetCartId(StringcartId){
this.cartId=cartId;
publicdoublegetMoney(){
returnmoney;
publicvoidsetMoney(doublemoney){
this.money=money;
publicvoiddrawmoney(doublemoney){
//先獲取是誰(shuí)來取錢,線程名即是人名
Stringname=Thread.currentThread().getName();
//同步代碼塊
//作用:把出現(xiàn)線程安全的核心代碼上鎖
//原理:每次只能一個(gè)線程進(jìn)入,執(zhí)行完畢后自行解鎖,其他線程才能進(jìn)來執(zhí)行
//鎖對(duì)象要求:理論上,鎖對(duì)象只要對(duì)于當(dāng)前同時(shí)執(zhí)行的線程是同一個(gè)對(duì)象即可
//缺點(diǎn):會(huì)干擾其他無關(guān)線程的執(zhí)行
synchronized("遇安"){//"鎖名自取,無意義"
//判斷賬戶是否夠錢
if(this.money=money){
//取錢
System.out.println(name+"來取錢成功,取了:"+money);
//更新金額
this.money-=money;
System.out.println(name+"取錢后剩余:"+this.money);
}else{
//余額不足
System.out.println(name+"來取錢,但余額不足!");
}
規(guī)范上:建議使用共享資源作為鎖對(duì)象
對(duì)于實(shí)例化方法建議使用this作為鎖對(duì)象
對(duì)于靜態(tài)方法,建議使用字節(jié)碼(類名.class)對(duì)象作為鎖對(duì)象
//接上文代碼
//實(shí)例化方法建議使用this作為鎖對(duì)象
synchronized(this){
//判斷賬戶是否夠錢
if(this.money=money){
//取錢
System.out.println(name+"來取錢成功,取了:"+money);
//更新金額
this.money-=money;
System.out.println(name+"取錢后剩余:"+this.money);
}else{
//余額不足
System.out.println(name+"來取錢,但余額不足!");
}
//靜態(tài)方法建議使用類名.class作為鎖對(duì)象
//每次只有一個(gè)線程能鎖這個(gè)類,而類也是唯一的
publicstaticvoidrun(){
synchronized(account.class){
}
第二種方法:同步方法
//同步方法
publicsynchronizedvoiddrawmoney(doublemoney){
//先獲取是誰(shuí)來取錢,線程名即是人名
Stringname=Thread.currentThread().getName();
//判斷賬戶是否夠錢
if(this.money=money){
//取錢
System.out.println(name+"來取錢成功,取了:"+money);
//更新金額
this.money-=money;
System.out.println(name+"取錢后剩余:"+this.money);
}else{
//余額不足
System.out.println(name+"來取錢,但余額不足!");
}
那么同步代碼塊和同步方法哪個(gè)好一點(diǎn)呢?
答案是:同步代碼塊
因?yàn)橥酱a塊鎖的范圍更小一點(diǎn),同步方法鎖的范圍更大一點(diǎn)
但其實(shí)在現(xiàn)實(shí)中同步方法用的更多一點(diǎn),因?yàn)榇a簡(jiǎn)潔好寫一點(diǎn),更方便
第三種方法:Lock鎖
JDK5后出現(xiàn),更加靈活方便
Lock是接口不能直接實(shí)例化,我們需要采用它的實(shí)現(xiàn)類ReentrantLock來構(gòu)建Lock鎖對(duì)象
importjava.util.concurrent.locks.Lock;
importjava.util.concurrent.locks.ReentrantLock;
publicclass多線程_4線程同步Lock鎖{
publicstaticvoidmain(String[]args){
//定義線程類,創(chuàng)建一個(gè)共享的賬戶對(duì)象
accounta=newaccount("abc",10000);
//創(chuàng)建兩個(gè)取錢的線程對(duì)象
newdrawthread(a,"小明").start();
newdrawthread(a,"小紅").start();
//取錢的線程類
classdrawthread2extendsThread{
//接收處理的賬戶對(duì)象
privateaccountacc;
publicdrawthread2(accountacc,Stringname){
super(name);
this.acc=acc;
publicvoidrun(){
//取錢
acc.drawmoney(10000);
classaccount2{
privateStringcartId;
privatedoublemoney;//賬戶余額
//final修飾后:鎖對(duì)象是唯一的和不可替換的
//Lock是接口不能直接實(shí)例化,我們需要采用它的實(shí)現(xiàn)類ReentrantLock來構(gòu)建Lock鎖對(duì)象
privatefinalLocklock=newReentrantLock();
publicaccount2(){
publicaccount2(StringcartId,doublemoney){
this.cartId=cartId;
this.money=money;
publicStringgetCartId(){
returncartId;
publicvoidsetCartId(StringcartId){
this.cartId=cartId;
publicdoublegetMoney(){
returnmoney;
publicvoidsetMoney(doublemoney){
this.money=money;
publicvoiddrawmoney(doublemoney){
//先獲取是誰(shuí)來取錢,線程名即是人名
Stringname=Thread.currentThread().getName();
lock.lock();//上鎖
//判斷賬戶是否夠錢
try{
if(this.money=money){
//取錢
System.out.println(name+"來取錢成功,取了:"+mone
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026首都醫(yī)科大學(xué)事業(yè)編制崗位招聘69人(第一批)考試備考試題及答案解析
- 2026福建省閩侯白沙國(guó)有林場(chǎng)招聘勞務(wù)派遣護(hù)林員1人參考考試題庫(kù)及答案解析
- 獅山鎮(zhèn)財(cái)務(wù)管理制度(3篇)
- 平壩跨年活動(dòng)策劃方案(3篇)
- 游戲年會(huì)活動(dòng)策劃方案(3篇)
- js屋面施工方案(3篇)
- 2026四川涼山州越西公安招聘警務(wù)輔助30人參考考試題庫(kù)及答案解析
- 2026廣東肇慶市廣寧縣公安局招聘警務(wù)輔助人員7人(第一次)考試參考試題及答案解析
- 2026山東威海乳山市事業(yè)單位招聘初級(jí)綜合類崗位人員參考考試題庫(kù)及答案解析
- 北京農(nóng)學(xué)院2026年人才引進(jìn)備考考試題庫(kù)及答案解析
- 2026年江西科技學(xué)院?jiǎn)握新殬I(yè)技能筆試備考試題含答案解析
- 深度解析(2026)《MZT 238-2025 監(jiān)測(cè)和定位輔助器具 毫米波雷達(dá)監(jiān)測(cè)報(bào)警器》
- 2025-2026學(xué)年小學(xué)美術(shù)湘美版(2024)四年級(jí)上冊(cè)期末練習(xí)卷及答案
- 遼寧省大連市2026屆高三上學(xué)期1月雙基模擬考試語(yǔ)文試題(含答案)
- 2025年腫瘤科年度工作總結(jié)匯報(bào)
- 浙江省寧波市2025-2026學(xué)年八年級(jí)上數(shù)學(xué)期末自編模擬卷
- 2025版《煤礦安全規(guī)程》學(xué)習(xí)與解讀課件(監(jiān)控與通信)
- 陶瓷巖板應(yīng)用技術(shù)規(guī)程
- 中藥制劑技術(shù)中職PPT完整全套教學(xué)課件
- 龍虎山正一日誦早晚課
- WORD版A4橫版密封條打印模板(可編輯)
評(píng)論
0/150
提交評(píng)論