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

在java中同步写入同一文件的多个线程,java,multithreading,file-io,synchronization,pipe,Java,Multithreading,File Io,Synchronization,Pipe,当然,使用“synchronized”的方法是显而易见的。 但我正在创建一个设计用于在多个内核上运行的系统 并在同一毫秒内多次写入该文件。 所以我相信使用同步会严重影响性能。 我正在考虑使用java的Pipe类(但不确定它是否有用) 或者让每个线程写入一个不同的文件和一个额外的线程 那些作品,创造了最终的结果。 我应该提到的是,写作的顺序并不重要,它是有时间戳的 无论如何,在纳米时代。 那两个更好的主意是什么?你还有其他建议吗? 谢谢。这不是对您问题的直接回答,但该项目内置了同步功能,可用于从不

当然,使用“synchronized”的方法是显而易见的。 但我正在创建一个设计用于在多个内核上运行的系统 并在同一毫秒内多次写入该文件。 所以我相信使用同步会严重影响性能。 我正在考虑使用java的Pipe类(但不确定它是否有用) 或者让每个线程写入一个不同的文件和一个额外的线程 那些作品,创造了最终的结果。 我应该提到的是,写作的顺序并不重要,它是有时间戳的 无论如何,在纳米时代。 那两个更好的主意是什么?你还有其他建议吗?
谢谢。

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

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

您的担心是对的,您不可能让所有线程都写入同一个文件而不会出现性能问题

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


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

您担心的是对的,您不可能让所有线程都写入同一个文件而不出现性能问题

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


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

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


如果我有足够的RAM,我会为每个日志生产者线程创建一个某种类型的队列,并创建一个日志消费者线程以循环方式(或类似方式)从所有队列中读取数据。

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


如果我有足够的RAM,我会为每个日志生产者线程创建某种队列,并创建一个日志使用者线程,以循环方式(或类似方式)从所有队列中读取数据。

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

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

您需要指定所追求的速度、吞吐量或延迟。您是否需要在1ms内写入10km/s或任何给定消息?另外,若你们关心磁盘写入的可靠性(你们能承受进程崩溃时的延迟写入),你们需要指定你们追求的速度、吞吐量或延迟。您是否需要在1ms内写入10km/s或任何给定消息?另外,若您关心磁盘写入的可靠性(在进程崩溃时,您能承受延迟写入的损失)。