2013-03-11 51 views
0

有没有办法让多个线程同时对RandomAccessFile执行读/写操作,即并发?我是否必须使用任何同步对象,还是可以在不使用任何同步的情况下完成?如何允许多个线程同时访问Java中的随机访问文件

+1

看看http://stackoverflow.com/questions/464784/java-reentrantreadwritelocks-how-to-safely-acquire-write-lock你最好的选择是使用像http://www.sqlite.org这样的数据库或其他。 – 2013-03-11 13:57:43

回答

0

您必须使用某种同步方法。文件中只能有一个文件位置。 如果您尝试没有同步的并发访问,最好的行为是不可预知的。

1

正如Erik所说,必须有一个同步机制。否则,这成为读者/作家的问题。

如果您可能想要加快速度,可以将多个读取结合在一起,并且每当需要编写时,停止新的读取请求,完成现有请求,获取锁定,写入文件,释放锁定。

ReentrantReadWriteLock可能会帮助你。

+1

如果RandomFileAccess不是一个绝对的需求,还可以看看java.nio.channels.FileChannel提供了什么样的随机访问,共享/独占锁定(的段)文件,并直接在内存映射通过写。虽然,就像RandomAccessFile一样,FileChannel在任何给定的时间点上只有一个位置,但在某个时刻仍然需要同步。 – GPI 2013-03-11 14:10:23

+0

并不是说文件只能通过一个FileChannel,文件描述符或其他来访问。 – Ingo 2013-03-11 18:38:02

1

随机存取文件的行为与随机存取存储器相同 - 它对各种数据竞争都是开放的。因此,只要你不是不同的线程在文件的不同区域工作,你绝对必须使用同步。