繁体   English   中英

如何同步明智的文件编写器对象?

[英]How to synchronize file wise file writer object?

目前,我正在设计我的产品架构师,并且面临以下问题。

我有一个队列,我在其中放入包含字符串和应在其中写入字符串的文件名的对象。

假设我有10个文件,例如OneFile.txt,twoFile.txt等。现在在Queue中,我有3个对象OneFile.txt,5个对象twoFile.txt。

我有多个写入文件的线程。 现在,如果我同步文件编写器对象,那么它将阻止我的其他未写入同一文件的线程。

假设有两个线程T1和T2。 T1线程正在写入OneFile.txt。 T2线程要写入twoFile.txt,然后在T1写入OneFile.txt时T2线程阻塞。 T2不应该被阻止,因为它要写入twoFile.txt。

请提出什么是好的架构。 请为此提供示例代码。

并行编写是否是一个好主意,这一点并不明显。 例如,在硬盘上,您通常会使其变慢,而在SSD上,它可能会变快,但这取决于您的情况(文件大小,在实际IO之前进行的处理等)。 如果您需要更快的速度也不是很明显。

因此,只需使用一个线程,直到您确定它是瓶颈。

像您可以使用AsynchronousFileChannel的接缝(考虑到您正在运行Java 1.7+)。 您将为每个要写入的文件打开一个通道(请参见open方法)。

此类通道提供了异步写入操作,您可以在其中指定应从文件中的哪个位置进行写入-AsynchronousFileChannel#write(java.nio.ByteBuffer,long,A,java.nio.channels.CompletionHandler) 这也使您也可以并行写入同一文本文件。 您唯一需要做的就是照顾“下一个写入位置”。 您可以通过每个通道保留一个AtomicLong并使用CompareAndSwap来执行并发更新来做到这一点:

这是我们项目中CustomAsyncChannel类的代码的稳定性

/**
 * Reserves the writing position in this channel with the given size. This method is thread
 * safe.
 * 
 * @param writeSize
 *            Size of writing that has to be done.
 * @return Returns the position where file should be written.
 */
public long reserveWritingPosition(long writeSize) {
    while (true) {
        long writingPosition = nextWritingPosition.get();
        if (nextWritingPosition.compareAndSet(writingPosition, writingPosition + writeSize)) {
            return writingPosition;
        }
    }
}

该课程本身应该对您来说是一个很好的指南。 请注意,写入只能部分完成,您可以在传递给写入操作的CompletionHandler中进行检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM