如何解决Java多线程环境中对象的序列化
- 在这种情况下,序列化安全吗?
否。正如@Tom Hawtin所说,您将需要执行自己的锁定,以确保在序列化对象时不会更改对象。
- 它是如何工作的?也就是说,ObjectOutputStream是否将执行序列化块,直到不再有任何线程在Counter上运行了?
ObjectOutputStream
不会在引擎盖下锁定。如有必要,由应用程序决定。
- 如果Counter的同步不使用固有锁,而是使用其他锁怎么办?
然后,在序列化发生时,您的应用程序还需要使用其他锁定来锁定更新。
如果您要序列化的状态仅由一个对象的状态和两个字段组成,则锁争用和粒度应该不成问题。但是,如果对象很复杂,那么锁争用就很成问题了,获取锁而又没有死锁风险的问题也很成问题。这种情况需要仔细设计。
解决方法
我有一个对象,其内部可变状态正在由一个或多个线程不断更新。对象已同步,目标是从另一个线程定期保存其状态(通过序列化):
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
同步不使用固有锁,而是使用其他锁怎么办?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。