Java。多線程環(huán)境中對(duì)象的序列化
否。正如@Tom Hawtin所說(shuō),您將需要執(zhí)行自己的鎖定,以確保在序列化對(duì)象時(shí)不會(huì)更改對(duì)象。@H_502_7@它是如何工作的?也就是說(shuō),ObjectOutputStream是否將執(zhí)行序列化塊,直到不再有任何線程在Counter上運(yùn)行了?
ObjectOutputStream@H_403_16@不會(huì)在引擎蓋下鎖定。如有必要,由應(yīng)用程序決定。@H_502_7@如果Counter的同步不使用固有鎖,而是使用其他鎖怎么辦?
然后,在序列化發(fā)生時(shí),您的應(yīng)用程序還需要使用其他鎖定來(lái)鎖定更新。@H_502_7@
如果您要序列化的狀態(tài)僅由一個(gè)對(duì)象的狀態(tài)和兩個(gè)字段組成,則鎖爭(zhēng)用和粒度應(yīng)該不成問(wèn)題。但是,如果對(duì)象很復(fù)雜,那么鎖爭(zhēng)用就很成問(wèn)題了,獲取鎖而又沒(méi)有死鎖風(fēng)險(xiǎn)的問(wèn)題也很成問(wèn)題。這種情況需要仔細(xì)設(shè)計(jì)。@H_502_7@解決方法
我有一個(gè)對(duì)象,其內(nèi)部可變狀態(tài)正在由一個(gè)或多個(gè)線程不斷更新。對(duì)象已同步,目標(biāo)是從另一個(gè)線程定期保存其狀態(tài)(通過(guò)序列化):
public class Counter implements Serializable { private int dogCount; private int catCount; public synchronized void updateFromDogThread( int count ) { dogCount = count; } public synchronized void updateFromCatThread( int count ) { catCount = count; }}
問(wèn)題:
在這種情況下,序列化安全嗎?它是如何工作的?也就是說(shuō),ObjectOutputStream執(zhí)行序列化是否會(huì)阻塞直到不再有線程運(yùn)行Counter?如果Counter同步不使用固有鎖,而是使用其他鎖怎么辦?相關(guān)文章:
1. sql語(yǔ)句如何按or排序取出記錄2. node.js - 用nodejs 的node-xlsx模塊去讀取excel中的數(shù)據(jù),可是讀取出來(lái)的日期是數(shù)字,請(qǐng)問(wèn)該如何讀取日期呢?3. 多選框?qū)戇M(jìn)數(shù)據(jù)庫(kù)怎么寫(xiě)4. php如何獲取訪問(wèn)者路由器的mac地址5. javascript - vue-resource中如何設(shè)置全局的timeout?6. 小程序怎么加外鏈,語(yǔ)句怎么寫(xiě)!求救新手,開(kāi)文檔沒(méi)發(fā)現(xiàn)7. html5 - input type=’file’ 上傳獲取的fileList對(duì)象怎么存儲(chǔ)于瀏覽器?8. javascript - 這兩種函數(shù)寫(xiě)法各有什么好處?9. 求教一個(gè)mysql建表分組索引問(wèn)題10. python沒(méi)入門(mén),請(qǐng)教一個(gè)問(wèn)題
