Java。多線程環境中對象的序列化
否。正如@Tom Hawtin所說,您將需要執行自己的鎖定,以確保在序列化對象時不會更改對象。@H_502_7@它是如何工作的?也就是說,ObjectOutputStream是否將執行序列化塊,直到不再有任何線程在Counter上運行了?
ObjectOutputStream@H_403_16@不會在引擎蓋下鎖定。如有必要,由應用程序決定。@H_502_7@如果Counter的同步不使用固有鎖,而是使用其他鎖怎么辦?
然后,在序列化發生時,您的應用程序還需要使用其他鎖定來鎖定更新。@H_502_7@
如果您要序列化的狀態僅由一個對象的狀態和兩個字段組成,則鎖爭用和粒度應該不成問題。但是,如果對象很復雜,那么鎖爭用就很成問題了,獲取鎖而又沒有死鎖風險的問題也很成問題。這種情況需要仔細設計。@H_502_7@解決方法
我有一個對象,其內部可變狀態正在由一個或多個線程不斷更新。對象已同步,目標是從另一個線程定期保存其狀態(通過序列化):
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執行序列化是否會阻塞直到不再有線程運行Counter?如果Counter同步不使用固有鎖,而是使用其他鎖怎么辦?相關文章:
1. javascript - 關于<a>元素與<input>元素的JS事件運行問題2. css3 - 純css實現點擊特效3. MySQL中的enum類型有什么優點?4. android下css3動畫非常卡,GPU也不差啊5. java - 為什么第一個線程已經釋放了鎖,第二個線程卻不行?6. mysql - 記得以前在哪里看過一個估算時間的網站7. javascript - vscode alt+shift+f 格式化js代碼,通不過eslint的代碼風格檢查怎么辦。。。8. 大家好,我想請問一下怎么做搜索欄能夠搜索到自己網站的內容。9. python - 啟動Eric6時報錯:’qscintilla_zh_CN’ could not be loaded10. mysql - 查詢字段做了索引為什么不起效,還有查詢一個月的時候數據都是全部出來的,如果分拆3次的話就沒問題,為什么呢。
