【问题标题】:Can multiple threads reading the same property file in Java cause performance issues?多个线程在 Java 中读取同一个属性文件会导致性能问题吗?
【发布时间】:2012-11-09 17:11:35
【问题描述】:

我正在创建多个线程并且所有线程都读取同一个属性文件(没有对属性文件进行写操作)。由于多个线程多次读取同一个属性文件,这是否会导致性能开销?

【问题讨论】:

  • 你多久阅读一次这个文件?
  • 只要你不写,我不会说会有任何并发​​问题
  • 这一切都是自下而上的——您是否注意到您的系统性能受到线程争用的影响?猜测是没有用的,尤其是在没有提供数据的情况下——你有一个线程吗?一百个线程?
  • 我在一个属性文件中有大约 600 行数据,我会说大约 40-50 个线程同时访问相同的数据

标签: java multithreading io


【解决方案1】:

我建议load the properties file 一次,所有线程都使用相同的Properties 实例。

加载一次减少磁盘访问:

  • 此应用程序的性能更好
  • 整个系统的可用性更高

多读不是并发问题。

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

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

【讨论】:

  • 会不会是多线程共享的同一个属性对象引用,会不会引起问题?
  • @raghuramgururajan 这是您的选择。您可以尝试这两种解决方案,看看哪种方案在速度和内存消耗方面效果最好,但如果您想避免并发访问同一个对象实例,恐怕您将不得不显式地跨线程复制属性列表。请注意,Properties 继承自 Hashtable,这是同步的。
【解决方案2】:

答案是“视情况而定”。这主要取决于每个线程除了读取属性文件之外还做了多少工作。如果每个线程除了读取文件之外还做很多工作,性能不会受到太大影响。

你应该更关心潜在的正确性问题:如果不同的线程使用不同的属性,程序会正确运行吗?否则,您的程序存在竞争风险错误:如果在程序运行时更改(或删除)属性文件,某些线程可能会使用不同的属性,从而产生不正确的计算。

属性文件用于程序配置。程序通常会在启动后不久读取所有配置信息,然后再进行任何实际工作。因此,如果配置错误,它们可能快速失败。您可能应该这样做,将线程的产生视为真正的工作稍后再做。这还可以确保您的程序的用户在配置中的每个错误只收到一条错误消息,而不是每个线程一条消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多