锁定序列化

时间:2017-06-22 18:30:06

标签: java multithreading serialization io locking

我是Java新手。 我正在通过编写小程序来练习。

在其中一个程序中,我有一个包含一些配置的对象。 可以在运行时更改此配置。 我通过序列化对象将配置保存到文件。

在我看来,我必须锁定我在序列化之前序列化的对象,以确保它在序列化期间不会改变。

synchronized (myObject)
{
    output.writeObject(myObject);
} 

但是我已经读过,应该尝试在同步块或任何其他形式的锁定中避免IO操作(例如写入文件)。它确实有意义,因为IO操作可能需要相对较长的时间,使其他线程等待/阻塞。

我想知道,是否有办法避免锁定下的序列化... 欢迎任何建议。

3 个答案:

答案 0 :(得分:0)

这个问题的几个解决方案是:

  1. 仅序列化不可变对象
  2. 创建对象的副本并序列化副本

答案 1 :(得分:0)

但是在设置对象和开始刷新它之间的间隔会发生什么?你仍然可能最终写了另一个对象。

一种可能的解决方案可能是在修改对象后仅锁定对象,并在刷新对象时先解锁。锁定和解锁可以通过获取和释放binary semaphore来完成。

所以,acquire()在写入对象变量之前是一个许可,而在序列化之后是release一个。这将仅阻止活动的修饰符线程,并有效地允许进一步的并发执行。这样可以避免示例中的I / O轮询。

一个问题是,在写入它之前和释放锁之前,可能会有来自 Writer-thread 的第二个上下文切换。但是,如果您可以让 Modifier-thread 等待更多,那么这就不用担心了。

希望这有帮助!

答案 2 :(得分:0)

您需要在锁内执行序列化过程,因为您的用例要求在写入期间没有人能够修改。

1.Basic解决方案将减少执行时间使用transient关键字来减少序列化的数据量。此外,在某些情况下,自定义的readObject()和writeObject()方法可能是有益的。

2.如果可能,您可以修改逻辑,以便可以拆分锁定以便多个线程可以读取/但无法修改。

3.您可以在集合中使用模式,如迭代可能需要很长时间,因此它们会在迭代之前克隆原始对象。