1、為什麼要同步?
在多個執行緒併發訪問同乙個資源的時候,可能會出現乙個執行緒對共享資源(臨界資源)進行了修改,但是該執行緒還沒有結束,這時另乙個執行緒也來對這個共享資源進行修改,後果可想而知了。舉個例子,假設甲和乙都用同乙個賬戶取錢,原來賬戶中有餘額800,甲取了800,在甲取錢之後,銀行還沒有計算剩下餘額之前,乙跑過來取錢,這裡也取800,也是可以的(餘額還是800)。當甲乙兩線程都結束的時候,賬戶餘額是-800……
**如下
//這裡不考慮驗證賬戶和密碼
public
class account
// 構造器
public
account(double balance)
// balance的setter和getter方法
public
void
setbalance(double balance)
public
double
getbalance()
}
public
class
drawthread
extends
thread
// 當多條執行緒修改同乙個共享資料時,將涉及資料安全問題。
public
void
run()
catch (interruptedexception ex)
// 修改餘額
account.setbalance(account.getalance() - drawamount);
system.out.prrintln("餘額為: " +account.getbalance());
}else
}}
public
class drawtest
}
執行上面**總是會出現餘額為-800的情況,而執行緒的同步就是為了避免類似於上述情況的發生。
2.同步的實現方式
多執行緒同步的關鍵字就是synchronized,沒錯,就是這貨。可能有不少童鞋經常看到這貨出現在方法簽名裡,還有**塊也會出現這貨,這兩種寫法有什麼不同?
(1)先來看出現在**塊的那種(同步**塊)
寫法如下
synchronized(object o)
o是什麼?學名同步監視器,對應上面例子的acct物件,就是執行緒要併發訪問的物件。使用了這個同步**塊就可以保證一次只能由乙個執行緒來訪問臨界資源。按照上面的 例子就是在甲取錢那個方法結束之後,才能讓乙來取錢。再舉乙個接地氣的例子,就像是上廁所一樣,乙個廁所一次只能讓乙個人使用,呃..一般人都會鎖門(synchronized)吧,就類似於用了上面方法進行了同步,想一下如果不鎖門,是不是尷尬了( ̄▽ ̄)」。
改造一下,同步之後的**如下:
public
class
drawthread
extends
thread
// 當多條執行緒修改同乙個共享資料時,將涉及資料安全問題。
public
void
run()
catch (interruptedexception ex)
// 修改餘額
account.setbalance(account.getbalance() - drawamount);
system.out.println("餘額為: " + account.getbalance());
}else
}// 同步**塊結束,該執行緒釋放同步鎖
}}
(2)出現在方法簽名裡的(同步方法)
寫法如下:
public synchronized zzz ***(yyy yyy)
誰呼叫這個方法誰就是同步監視器(acct物件),其實就是this啦。
前面的**中是那個環節出了問題?對,取錢。那兩個執行緒用乙個賬戶訪問的是取錢方法(run()),所以如果使用這種同步方法的方式進行同步,就需要改造取錢(run())方法了。
**如下:
// 提供乙個執行緒安全draw()方法來完成取錢操作
public
synchronized
void draw(double drawamount)
catch (interruptedexception ex)
// 修改餘額
balance -= drawamount;
system.out.println("餘額為: " + balance);
}else
}
總結一下哈,個人感覺同步**塊就是對多執行緒併發訪問的物件加鎖,而同步方法,是對多執行緒呼叫的方法上鎖。
以上為個人見解,如有錯誤,請批評指正,謝謝~!
多執行緒的同步
執行緒的同步 在多執行緒程式設計中,這種會被多個執行緒同時訪問的資源叫做臨界資源。synchronized 關鍵字是乙個修飾符,可以修飾方法或 塊。其作用是 對於同乙個物件 不是乙個類的不同物件 當多個執行緒都同時呼叫該方法或 塊時,必須一次執行,也就是說,如果兩個或兩個以上的執行緒同時執行該段 如...
多執行緒的同步
1 多執行緒的應用 多執行緒是為了使得多個執行緒並行的工作以完成多項任務,以提高系統的效率。使用多執行緒帶來的好處有 a 可以把佔據長時間的程式中的任務作為乙個單獨的執行緒放到後台去處理。而使用者介面可以繼續響應使用者的操作。例如使用者單擊了乙個按鈕去觸發某些事件的處理,可以彈出乙個進度條來顯示處理...
多執行緒同步
synchronized 物件 其中物件相當於乙個標誌 鎖 用於判斷 同步 塊 同步的前提必須是兩個或兩個以上的執行緒,且共用同乙個鎖 同步解決了多執行緒的安全問題 弊端 多執行緒需要判斷鎖,消耗了資源 同步函式 將synchronized放在函式名前面即可 即具有同步性質 使用的鎖是this 靜態...