【发布时间】:2017-07-30 04:07:06
【问题描述】:
我正在创建一个RandomAccessFile 对象以通过多个线程写入文件(在 SSD 上)。每个线程都尝试在文件中的特定位置写入直接字节缓冲区,并且我确保线程写入的位置不会与另一个线程重叠:
file_.getChannel().write(buffer, position);
其中file_ 是RandomAccessFile 的一个实例,buffer 是一个直接字节缓冲区。
对于 RandomAccessFile 对象,由于我没有使用 fallocate 来分配文件,并且文件的长度在变化,这会利用底层媒体的并发性吗?
如果不是,那么在创建文件时不调用 fallocate 使用上述函数有什么意义吗?
【问题讨论】:
-
这个问题不同,因为我使用getChannel接口在特定位置写入而不是更改文件的当前位置
-
是的,它们已经足够不同了,这就是为什么我没有使用强大的 Mjölnir 来结束这个问题,但是在另一个问题中存在一些内容,并且它的答案在这里具有相关性。
-
从FileChannel 的文档中,您的问题自己回答了,这取决于操作系统的实现:“文件通道可以安全地供多个并发线程使用。[...] 其他操作,特别是那些采取明确立场的人可能会同时进行;他们是否真的这样做取决于底层的实现,因此是未指定的。”
标签: java multithreading randomaccessfile filechannel