我有一个多线程应用程序,我的一些线程应该从队列中读取数据并将它们写入文件。这里的问题是,每当我的一个线程从队列读取值并将其写入同一文件或每次只能有一个BufferedWriter实例和flush()
时,我是否应该创建新的BufferedWriter实例,这让我感到困惑。第二个解决方案中的一个问题是我应该检测何时应该关闭BufferedWriter而不使用Java 7完美解决方案来关闭try-catch
块中的资源。
第二种解决方案是否解决了一些性能问题? 这方面的最佳做法是什么?
答案 0 :(得分:1)
BufferedWriter应该导致一个文件/ Writer / OutputStream;如果你有很多目标,你需要很多缓冲区。如果要从多个线程写入同一文件,则需要在最早的位上进行同步;如果您没有更多的字符流高级构造,则可以在BufferredWriter上进行同步。如果在BufferedWriter上进行同步,则不需要在每次访问结束后调用flush()。
答案 1 :(得分:1)
我建议使用一个BufferedWriter
来写入所有线程共享的文件。为了提高性能,BufferedWriter
应该保持打开状态,直到应用程序确定没有更多输出为止。 (打开和关闭文件相对昂贵。)
您还需要让应用程序线程使用某种锁定(例如BufferedWriter
上的同步)以确保它们不会同时尝试写入。 BufferedWriter
类不是线程安全的。
在打开大量文件的情况下,管理文件资源的try / finally或try-with-resources方法非常重要。如果您只处理一个文件,并且需要在整个应用程序期间打开,那么资源管理就不那么重要了。 (但是你需要确保在应用程序退出之前关闭或刷新。)
但我认为BufferedWriter是线程安全的,因为使用synchronized块的write()方法的底层实现
从这个意义上讲,是的,是的。但是,假设当您的线程写入数据时,它会在单个write(...)
调用中执行此操作。
另请注意,BufferedWriter
未指定 是线程安全的,即使它在当前实现中是线程安全的。