文章詳情頁(yè)
JAVA教程:解析Java的多線程機(jī)制(4)
瀏覽:162日期:2024-07-02 13:29:56
內(nèi)容: 線程間的同步 Java應(yīng)用程序的多個(gè)線程共享同一進(jìn)程的數(shù)據(jù)資源,多個(gè)用戶(hù)線程在并發(fā)運(yùn)行過(guò)程中可能同時(shí)訪問(wèn)具有敏感性的內(nèi)容。在Java中定義了線程同步的概念,實(shí)現(xiàn)對(duì)共享資源的一致性維護(hù)。下面以筆者最近開(kāi)發(fā)的移動(dòng)通信計(jì)費(fèi)系統(tǒng)中線程間同步控制方法,說(shuō)明Java語(yǔ)言中多線程同步方式的實(shí)現(xiàn)過(guò)程。 在沒(méi)有多線程同步控制策略條件下的客戶(hù)賬戶(hù)類(lèi)定義框架代碼如下所示: public class RegisterAccount { float fBalance; //客戶(hù)繳費(fèi)方法 public void deposit(float fFees){ fBalance += fFees; } //通話計(jì)費(fèi)方法 public void withdraw(float fFees){ fBalance -= fFees; } … … } 讀者也許會(huì)認(rèn)為:上述程序代碼完全能夠滿(mǎn)足計(jì)費(fèi)系統(tǒng)實(shí)際的需要。確實(shí),在單線程環(huán)境下該程序確實(shí)是可靠的。但是,多進(jìn)程并發(fā)運(yùn)行的情況是怎樣的呢?假設(shè)發(fā)生這種情況:客戶(hù)在客戶(hù)服務(wù)中心進(jìn)行繳費(fèi)的同時(shí)正在利用移動(dòng)通信設(shè)備僅此通話,客戶(hù)通話結(jié)束時(shí)計(jì)費(fèi)系統(tǒng)啟動(dòng)計(jì)費(fèi)進(jìn)程,而同時(shí)服務(wù)中心的工作人員也提交繳費(fèi)進(jìn)程運(yùn)行。讀者可以看到如果發(fā)生這種情況,對(duì)客戶(hù)賬戶(hù)的處理是不嚴(yán)肅的。 如何解決這種問(wèn)題呢?很簡(jiǎn)單,在RegisterAccount類(lèi)方法定義中加上用于標(biāo)識(shí)同步方法的關(guān)鍵字synchronized。這樣,在同步方法執(zhí)行過(guò)程中該方法涉及的共享資源(在上述代碼中為fBalance成員變量)將被加上共享鎖,以確保在方法運(yùn)行期間只有該方法能夠?qū)蚕碣Y源進(jìn)行訪問(wèn),直到該方法的線程運(yùn)行結(jié)束打開(kāi)共享鎖,其它線程才能夠訪問(wèn)這些共享資源。在共享鎖沒(méi)有打開(kāi)的時(shí)候其它訪問(wèn)共享資源的線程處于阻塞狀態(tài)。 進(jìn)行線程同步策略控制后的RegisterAccount類(lèi)定義如下面代碼所示: public class RegisterAccount { float fBalance; public synchronized void deposit(float fFees){ fBalance += fFees; } public synchronized void withdraw(float fFees){ fBalance -= fFees; } … … } 從經(jīng)過(guò)線程同步機(jī)制定義后的代碼形式可以看出:在對(duì)共享資源進(jìn)行訪問(wèn)的方法訪問(wèn)屬性關(guān)鍵字(public)后附加同步定義關(guān)鍵字synchronized,使得同步方法在對(duì)共享資源訪問(wèn)的時(shí)候,為這些敏感資源附加共享鎖來(lái)控制方法執(zhí)行期間的資源獨(dú)占性,實(shí)現(xiàn)了應(yīng)用系統(tǒng)數(shù)據(jù)資源的一致性管理和維護(hù)。 轉(zhuǎn)自: 賽迪網(wǎng) Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標(biāo)簽:
Java
相關(guān)文章:
1. 兩個(gè)例子了解java中的回調(diào)機(jī)制2. Java如何基于反射機(jī)制獲取不同的類(lèi)3. Docker 容器健康檢查機(jī)制4. Python Flask上下文管理機(jī)制實(shí)例解析5. React渲染機(jī)制及相關(guān)優(yōu)化方案6. Python多線程實(shí)現(xiàn)支付模擬請(qǐng)求過(guò)程解析7. python基于concurrent模塊實(shí)現(xiàn)多線程8. 基于Python爬取京東雙十一商品價(jià)格曲線9. Java多線程實(shí)現(xiàn)多人聊天室功能10. 詳解瀏覽器的緩存機(jī)制
排行榜

網(wǎng)公網(wǎng)安備