我是Java新手。 我正在通过编写小程序来练习。
在其中一个程序中,我有一个包含一些配置的对象。 可以在运行时更改此配置。 我通过序列化对象将配置保存到文件。
在我看来,我必须锁定我在序列化之前序列化的对象,以确保它在序列化期间不会改变。
synchronized (myObject)
{
output.writeObject(myObject);
}
但是我已经读过,应该尝试在同步块或任何其他形式的锁定中避免IO操作(例如写入文件)。它确实有意义,因为IO操作可能需要相对较长的时间,使其他线程等待/阻塞。
我想知道,是否有办法避免锁定下的序列化... 欢迎任何建议。
答案 0 :(得分:0)
这个问题的几个解决方案是:
答案 1 :(得分:0)
但是在设置对象和开始刷新它之间的间隔会发生什么?你仍然可能最终写了另一个对象。
一种可能的解决方案可能是在修改对象后仅锁定对象,并在刷新对象时先解锁。锁定和解锁可以通过获取和释放binary semaphore来完成。
所以,acquire()
在写入对象变量之前是一个许可,而在序列化之后是release
一个。这将仅阻止活动的修饰符线程,并有效地允许进一步的并发执行。这样可以避免示例中的I / O轮询。
一个问题是,在写入它之前和释放锁之前,可能会有来自 Writer-thread 的第二个上下文切换。但是,如果您可以让 Modifier-thread 等待更多,那么这就不用担心了。
希望这有帮助!
答案 2 :(得分:0)
您需要在锁内执行序列化过程,因为您的用例要求在写入期间没有人能够修改。
1.Basic解决方案将减少执行时间使用transient关键字来减少序列化的数据量。此外,在某些情况下,自定义的readObject()和writeObject()方法可能是有益的。
2.如果可能,您可以修改逻辑,以便可以拆分锁定以便多个线程可以读取/但无法修改。
3.您可以在集合中使用模式,如迭代可能需要很长时间,因此它们会在迭代之前克隆原始对象。