Java。多線程環(huán)境中對(duì)象的序列化
否。正如@Tom Hawtin所說,您將需要執(zhí)行自己的鎖定,以確保在序列化對(duì)象時(shí)不會(huì)更改對(duì)象。@H_502_7@它是如何工作的?也就是說,ObjectOutputStream是否將執(zhí)行序列化塊,直到不再有任何線程在Counter上運(yùn)行了?
ObjectOutputStream@H_403_16@不會(huì)在引擎蓋下鎖定。如有必要,由應(yīng)用程序決定。@H_502_7@如果Counter的同步不使用固有鎖,而是使用其他鎖怎么辦?
然后,在序列化發(fā)生時(shí),您的應(yīng)用程序還需要使用其他鎖定來鎖定更新。@H_502_7@
如果您要序列化的狀態(tài)僅由一個(gè)對(duì)象的狀態(tài)和兩個(gè)字段組成,則鎖爭(zhēng)用和粒度應(yīng)該不成問題。但是,如果對(duì)象很復(fù)雜,那么鎖爭(zhēng)用就很成問題了,獲取鎖而又沒有死鎖風(fēng)險(xiǎn)的問題也很成問題。這種情況需要仔細(xì)設(shè)計(jì)。@H_502_7@解決方法
我有一個(gè)對(duì)象,其內(nèi)部可變狀態(tài)正在由一個(gè)或多個(gè)線程不斷更新。對(duì)象已同步,目標(biāo)是從另一個(gè)線程定期保存其狀態(tài)(通過序列化):
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; }}
問題:
在這種情況下,序列化安全嗎?它是如何工作的?也就是說,ObjectOutputStream執(zhí)行序列化是否會(huì)阻塞直到不再有線程運(yùn)行Counter?如果Counter同步不使用固有鎖,而是使用其他鎖怎么辦?相關(guān)文章:
1. mysql儲(chǔ)存json錯(cuò)誤2. 在mybatis使用mysql的ON DUPLICATE KEY UPDATE語(yǔ)法實(shí)現(xiàn)存在即更新應(yīng)該使用哪個(gè)標(biāo)簽?3. 哭遼 求大佬解答 控制器的join方法怎么轉(zhuǎn)模型方法4. 怎么php怎么通過數(shù)組顯示sql查詢結(jié)果呢,查詢結(jié)果有多條,如圖。5. sql語(yǔ)句 - 如何在mysql中批量添加用戶?6. mysql - 表名稱前綴到底有啥用?7. mysql - 怎么生成這個(gè)sql表?8. Navicat for mysql 中以json格式儲(chǔ)存的數(shù)據(jù)存在大量反斜杠,如何去除?9. 編輯成功不顯示彈窗10. mysql - 數(shù)據(jù)庫(kù)表中,兩個(gè)表互為外鍵參考如何解決
