2011-07-07 110 views
1

全部,其他线程修改对象时将对象写入文件

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

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

最后,我会写的哈希表来使用ObjectOutputStream文件,方法是一样的东西

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

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

如果是,我怎么能避免这个问题?使用锁定?但是,当我修改Hashtable时,我需要锁定它。

谢谢。

回答

3

基于我对代码的考察,我认为你不会有任何问题。 Hashtable类的访问器和变体声明为​​,Hashtable上的私有writeObject方法声明为序列化。这应该足以确保在串行器正在查看时没有任何东西可以改变Hashtable

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

+0

谢谢。你的评论帮了我很多。 – Jason

1

ConcurrentHashMap是你需要的。但是,这只会解决哈希映射并发访问问题。

与此同时,SessionData将需要做成不可变的,这将确保一个特定的实例一旦创建就永远不会改变。如果需要修改哈希映射条目 - 只需将其替换为SessionData的新实例即可。