同步在java中写入同一文件的多个线程

时间:2010-12-08 13:41:54

标签: java multithreading file-io synchronization pipe

当然有使用“同步”的明显方法。 但我正在创建一个专为在多个核心上运行而设计的系统 并以相同的毫秒不同时间写入该文件。 所以我认为使用同步会严重影响性能。 我在考虑使用java的Pipe类(但不确定它是否有用) 或让每个线程写入不同的文件和另一个线程收集 那些着作,创造了最终结果。 我应该提一下,这些着作的顺序并不重要,而且有时间戳 无论如何,在纳米时代。 这两个更好的想法是什么?还有其他建议吗? 感谢。

4 个答案:

答案 0 :(得分:2)

使用某种同步(例如单个互斥锁)非常容易实现。

如果我有足够的RAM,我会为每个日志生成者线程创建一些的队列,以及一个以循环方式从所有队列中读取的日志消费者线程(或者类似的东西)。

答案 1 :(得分:1)

不能直接回答您的问题,但logback项目内置了同步工具,可以从不同的线程写入同一个文件,因此如果符合您的需要,您可以尝试使用它,或者至少看看它的源代码。由于它是为速度而构建的,我很确定实现不是理所当然的。

答案 2 :(得分:1)

你是正确的,你不能让所有的线程写入同一个文件没有性能问题。

当我遇到这个问题时(在Log4j之前编写我自己的日志记录)我在内存中创建了两个固定大小的缓冲区,并且所有生成器线程都写入一个缓冲区,而专用的消费者线程从另一个缓冲区读取并写入到一个文件。这样,编写器线程必须仅在获取和递增索引到缓冲区以及何时交换缓冲区时进行同步,并且仅在当前缓冲区已满时才阻止。它内存密集但速度很快。

对于其他想法,您可以查看Log4j和Logback等记录器是如何工作的,他们必须解决这个问题。

答案 3 :(得分:1)

尝试使用JMS。在不同机器上运行的所有进程都可以发送JMS消息而不是写入文件。仅创建一个接收消息并将其写入文件的队列接收器。 Log4J已经具有此功能:请参阅JMSAppender。