2010-12-08 64 views
1

当然,使用“synchronized”的方式显然很明显。 但我创建了一个系统,设计用于在多个内核上运行,并在相同的毫秒内向该文件写入不同的次数。因此,我认为使用同步会严重损害性能。 我正在考虑使用Java的管道类(但不知道它是否会有所帮助) 或让每个线程写入不同的文件以及收集 这些写入的附加线程,从而创建最终结果。 我应该提到的是,文章的顺序并不重要,无论如何它都以时间戳 。 这两个更好的想法是什么?有没有其他建议? 谢谢。将几个线程同步写入到java中的同一个文件中

+0

您需要指定您以后的速度,吞吐量或等待时间。你需要在1ms内写入10k m/s或任何给定的消息吗?另外,如果你关心磁盘写入的可靠性(你可以承受在处理崩溃时延迟写入)。 – DaveC 2010-12-11 03:03:37

回答

2

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

如果我有足够的RAM,我想创建某种为每个登录生产者线程一个队列,日志消费者线程在一个循环的方式所有队列读取(或类似的东西) 。

1

不是你的问题的直接答案,但logback项目内置同步功能,用于从不同线程写入同一个文件,所以如果它适合你的需要,或者至少需要一个看看它的源代码。由于它是为速度而构建的,所以我非常肯定实现不被视为理所当然。

1

如果您担心,您将无法将所有线程写入同一个文件而没有性能问题。当我遇到这个问题(编写自己的日志记录,回到Log4j之前),我在内存中创建了两个固定大小的缓冲区,并让所有生产者线程写入一个缓冲区,同时从另一个缓冲区读取专用的使用者线程,写信给一个文件。这样,写入线程只需在获取索引和将索引递增到缓冲区并同步缓冲区时进行同步,并且只在当前缓冲区满时阻塞。这是内存密集型,但速度很快。

对于其他想法,你可以看看Log4j和Logback这样的记录器如何工作,他们将不得不解决这个问题。

1

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