Java中多个线程同时读取同一个属性文件会引起性能问题吗?

3

我正在创建多个线程,所有线程都读取相同的属性文件(没有对属性文件进行写操作)。这会导致性能开销吗?因为多个线程多次读取相同的属性文件。


你多久会读这个文件? - Brendan Long
只要你不在写入数据,我认为就不会有任何并发问题。 - Sam I am says Reinstate Monica
这些东西是自下而上工作的 - 你有没有注意到你的系统性能受到线程争用的影响?猜测是毫无意义的,特别是在没有提供数据的情况下 - 你有一个线程吗?一百个线程? - Boris Treukhov
我有大约600行数据在一个属性文件中,大约有40-50个线程同时访问相同的数据。 - raghuram gururajan
2个回答

5

我建议只需加载属性文件一次,然后在所有线程中使用同一个Properties实例。

仅加载一次可减少磁盘访问:

  • 这个应用程序性能更佳
  • 整个系统的可用性更高

多次读取不是并发问题。

didierc的评论突出了可能存在的瓶颈:每次访问Properties都是同步的,因此当一个线程读取值时,所有其他线程都可能等待。

为了避免这种情况,您可以将Properties的使用限制在构造函数或线程初始化中。不要在Thread.run()方法内部的循环中使用p.getProperty(XXX)


这个属性对象引用会被多个线程共享吗?会造成问题吗? - raghuram gururajan
@raghuramgururajan 这是你的选择。你可以尝试两种解决方案,看看哪个在速度和内存消耗方面更好,但如果你想避免对同一对象实例的并发访问,那么你需要在线程之间显式地复制属性列表。请注意,Properties 继承自 Hashtable,后者是同步的。 - didierc

0
答案是“取决于情况”。主要取决于每个线程在读取属性文件之外做了多少工作。如果每个线程除了读取文件外还有很多工作要做,那么性能不会受到太大影响。
您应该更关注潜在的正确性问题:如果不同的线程使用不同的属性,程序会表现正确吗?如果不行,您的程序就存在竞争危险错误:如果属性文件在程序运行时被修改(或删除),一些线程可能会使用不同的属性,从而产生错误的计算结果。
属性文件用于程序配置。程序通常在开始实际工作之前很快读取其所有配置信息。因此,如果配置错误,它们可以快速失败。您可能也应该这样做,将线程的生成视为以后要完成的“真正的工作”。这还确保您的程序用户每个配置错误只收到一个错误消息,而不是每个线程一个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接