gpt4 book ai didi

java - 当其他线程正在修改对象时将对象写入文件

转载 作者:行者123 更新时间:2023-11-29 03:55:30 24 4
gpt4 key购买 nike

全部,

我正在编写一个多线程程序。扩展 Thread 的类有一个 static Hashtalbe<Integer, SessionData> sessionDataTable .

在类里面,我会做一些改变 sessionDataTable 的事情,比如向其中插入一个新的 SessionData 对象,从中删除一个 SessionData 对象或修改 Hashtable 中的 SessionData 对象。

最后,我会使用ObjectOutputStream将Hashtable写入文件,方法是这样的

public static synchronized void saveDataSessionState()
{
...
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(Constants.logFile));
oos.writeObject(sessionDataTable);
...
}

我想知道如果一个线程正在做 oos.writeObject(sessionDataTable); 会发生什么但是其他线程正在该方法之外的某个地方同时修改 sessionDataTable(就像我上面说的)。上面的方法在写对象到文件的时候会不会异常?

如果是,我该如何避免这个问题?使用锁?但是每当我修改 Hashtable 时我都需要加锁。

谢谢。

最佳答案

根据我对代码的检查,我认为您不会遇到任何问题。 Hashtable 类的访问器和修改器声明为synchronizedHashtable 上的私有(private)writeObject 方法也是如此做序列化。这应该足以确保在序列化程序查看时没有任何内容可以更改 Hashtable

但是,如果在序列化发生时某些东西改变了 Hashtable 键或值的状态,您可能会遇到麻烦。 (我不知道对象的默认序列化是否执行持有对象的互斥体。我怀疑不是因为不必要的锁定成本,一个简单的互斥体不一定实现所需的独占访问,以及潜在的风险死锁。)

关于java - 当其他线程正在修改对象时将对象写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6605849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com