Java。多線程環(huán)境中對象的序列化
否。正如@Tom Hawtin所說,您將需要執(zhí)行自己的鎖定,以確保在序列化對象時不會更改對象。@H_502_7@它是如何工作的?也就是說,ObjectOutputStream是否將執(zhí)行序列化塊,直到不再有任何線程在Counter上運(yùn)行了?
ObjectOutputStream@H_403_16@不會在引擎蓋下鎖定。如有必要,由應(yīng)用程序決定。@H_502_7@如果Counter的同步不使用固有鎖,而是使用其他鎖怎么辦?
然后,在序列化發(fā)生時,您的應(yīng)用程序還需要使用其他鎖定來鎖定更新。@H_502_7@
如果您要序列化的狀態(tài)僅由一個對象的狀態(tài)和兩個字段組成,則鎖爭用和粒度應(yīng)該不成問題。但是,如果對象很復(fù)雜,那么鎖爭用就很成問題了,獲取鎖而又沒有死鎖風(fēng)險的問題也很成問題。這種情況需要仔細(xì)設(shè)計。@H_502_7@解決方法
我有一個對象,其內(nèi)部可變狀態(tài)正在由一個或多個線程不斷更新。對象已同步,目標(biāo)是從另一個線程定期保存其狀態(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í)行序列化是否會阻塞直到不再有線程運(yùn)行Counter?如果Counter同步不使用固有鎖,而是使用其他鎖怎么辦?相關(guān)文章:
1. java - spring boot 如何打包成asp.net core 那種獨(dú)立應(yīng)用?2. java - 在用戶不登錄的情況下,用戶如何添加保存到購物車?3. javascript - nginx反向代理靜態(tài)資源403錯誤?4. docker網(wǎng)絡(luò)端口映射,沒有方便點(diǎn)的操作方法么?5. javascript - 關(guān)于apply()與call()的問題6. docker - 各位電腦上有多少個容器啊?容器一多,自己都搞混了,咋辦呢?7. datetime - Python如何獲取當(dāng)前時間8. 安全性測試 - nodejs中如何防m(xù)ySQL注入9. 推薦好用mysql管理工具?for mac和pc10. Mysql 組合索引最左原則的疑惑
