




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第Java使用線程同步解決線程安全問題詳解作用:把出現(xiàn)線程安全的核心代碼上鎖
原理:每次只能一個線程進(jìn)入,執(zhí)行完畢后自行解鎖,其他線程才能進(jìn)來執(zhí)行
鎖對象要求:理論上,鎖對象只要對于當(dāng)前同時執(zhí)行的線程是同一個對象即可
缺點:會干擾其他無關(guān)線程的執(zhí)行
所以,這種只是理論上的,了解即可,現(xiàn)實中并不會這樣用
publicclass多線程_4線程同步{
publicstaticvoidmain(String[]args){
//定義線程類,創(chuàng)建一個共享的賬戶對象
accounta=newaccount("abc",10000);
//創(chuàng)建兩個取錢的線程對象
newdrawthread(a,"小明").start();
newdrawthread(a,"小紅").start();
//取錢的線程類
classdrawthreadextendsThread{
//接收處理的賬戶對象
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){
//先獲取是誰來取錢,線程名即是人名
Stringname=Thread.currentThread().getName();
//同步代碼塊
//作用:把出現(xiàn)線程安全的核心代碼上鎖
//原理:每次只能一個線程進(jìn)入,執(zhí)行完畢后自行解鎖,其他線程才能進(jìn)來執(zhí)行
//鎖對象要求:理論上,鎖對象只要對于當(dāng)前同時執(zhí)行的線程是同一個對象即可
//缺點:會干擾其他無關(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ī)范上:建議使用共享資源作為鎖對象
對于實例化方法建議使用this作為鎖對象
對于靜態(tài)方法,建議使用字節(jié)碼(類名.class)對象作為鎖對象
//接上文代碼
//實例化方法建議使用this作為鎖對象
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作為鎖對象
//每次只有一個線程能鎖這個類,而類也是唯一的
publicstaticvoidrun(){
synchronized(account.class){
}
第二種方法:同步方法
//同步方法
publicsynchronizedvoiddrawmoney(doublemoney){
//先獲取是誰來取錢,線程名即是人名
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+"來取錢,但余額不足!");
}
那么同步代碼塊和同步方法哪個好一點呢?
答案是:同步代碼塊
因為同步代碼塊鎖的范圍更小一點,同步方法鎖的范圍更大一點
但其實在現(xiàn)實中同步方法用的更多一點,因為代碼簡潔好寫一點,更方便
第三種方法:Lock鎖
JDK5后出現(xiàn),更加靈活方便
Lock是接口不能直接實例化,我們需要采用它的實現(xiàn)類ReentrantLock來構(gòu)建Lock鎖對象
importjava.util.concurrent.locks.Lock;
importjava.util.concurrent.locks.ReentrantLock;
publicclass多線程_4線程同步Lock鎖{
publicstaticvoidmain(String[]args){
//定義線程類,創(chuàng)建一個共享的賬戶對象
accounta=newaccount("abc",10000);
//創(chuàng)建兩個取錢的線程對象
newdrawthread(a,"小明").start();
newdrawthread(a,"小紅").start();
//取錢的線程類
classdrawthread2extendsThread{
//接收處理的賬戶對象
privateaccountacc;
publicdrawthread2(accountacc,Stringname){
super(name);
this.acc=acc;
publicvoidrun(){
//取錢
acc.drawmoney(10000);
classaccount2{
privateStringcartId;
privatedoublemoney;//賬戶余額
//final修飾后:鎖對象是唯一的和不可替換的
//Lock是接口不能直接實例化,我們需要采用它的實現(xiàn)類ReentrantLock來構(gòu)建Lock鎖對象
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){
//先獲取是誰來取錢,線程名即是人名
Stringname=Thread.currentThread().getName();
lock.lock();//上鎖
//判斷賬戶是否夠錢
try{
if(this.money=money){
//取錢
System.out.println(name+"來取錢成功,取了:"+mone
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 如何選擇合適的藥學(xué)書籍試題及答案
- 網(wǎng)絡(luò)直播平臺環(huán)保公益內(nèi)容合作合同
- 智能家居微信小程序開發(fā)及售后服務(wù)合同
- 行政程序中的法律道德考量試題及答案
- 2025年樹脂型膠粘劑項目立項申請報告
- 網(wǎng)絡(luò)平臺用戶數(shù)據(jù)跨境傳輸安全保密協(xié)議
- 米香型白酒高級醇產(chǎn)生規(guī)律探究及應(yīng)用
- 輔具激痛點按法治療腰5-骶1椎間盤突出癥氣滯血瘀證的臨床觀察
- 體能訓(xùn)練中心會員服務(wù)與合同
- 2025年護(hù)士執(zhí)業(yè)復(fù)習(xí)資料及試題及答案
- 校車駕駛員交通安全培訓(xùn)
- 飛機(jī)維修員入門教程
- 超聲引導(dǎo)下神經(jīng)阻滯下肢篇
- 2024屆高三英語二輪專題復(fù)習(xí):關(guān)于水中或雨中脫困脫險的讀后續(xù)寫練習(xí)寫作素材
- 《如何處理人際關(guān)系》課件
- 中國帶狀皰疹診療專家共識2023版
- Part6 Unit1 Travel 課件-【中職專用】高一英語同步 課堂(高教版2021·基礎(chǔ)模塊2)(2023修訂版)
- 《旋轉(zhuǎn)變壓器 》課件
- 個人信息保護(hù)與隱私權(quán)益
- 皮下脂肪瘤學(xué)習(xí)課件
- 裝修常用數(shù)據(jù)手冊(空間布局和尺寸)
評論
0/150
提交評論