2

我在我的代码中使用属性,我对多重访问感到好奇。我在以下情况下:

public Class MClass{
    private static Properties dicoCategories = new Properties(myPropertyFile);
    public void changeProperties(){
        // changing properties and updating the file
    }
}

MyClass 被多次实例化,每个实例都可以修改属性文件。我想我可以使用临时文件和锁来管理这种并发,但我更喜欢使用已经存在的函数。然而,我没有找到。我的问题是:Property 类是否以一种特殊的方式管理并发,或者是否有一个多用户等价物?

4

4 回答 4

8

尽管该Properties文件线程安全的,但如果您使用多次调用对其进行修改,您仍然需要确保线程安全。例如

properties.set(name, value);

是线程安全的,但是

if (properties.get(name) == null)  {
   properties.set(name, value);
}

没有额外的保护就不是线程安全的,你应该围绕这样的序列进行同步。

从您的问题中不清楚您的真正问题是否与访问此属性文件的多个进程有关,如果是这种情况,那么文件锁定可能是合适的。有关更多信息,请参阅此问题/答案

于 2013-07-05T09:00:55.123 回答
1

根据文档

此类是线程安全的:多个线程可以共享一个 Properties 对象,而无需外部同步。

于 2013-07-05T08:57:16.307 回答
1

根据 Java API,它是线程安全的:

http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html

这意味着您可以同时从不同的线程进行更改。但是,我会运行一个简单的并发测试来 100% 确定。您还可以进入源文件并查看 Java 在内部如何处理它...

于 2013-07-05T08:57:34.473 回答
1

根据Java 文档

This class is thread-safe: multiple threads can share 
a single Properties object without the need for external synchronization

因此,答案是您可以在多线程环境中使用 Properties 实例。您需要记住的是,如果对属性的更新非常频繁,那么由于属性中的隐式同步,您的应用程序可能会变慢。但是,如果偶尔出现,那应该没问题。

于 2013-07-05T08:58:02.473 回答