Java:线程安全的 RandomAccessFile

经过一些认真的谷歌搜索,我发现RandomAccessFile类不是线程安全的。现在,我可以使用一个信号量来锁定所有读取和写入,但我认为这性能不是很好。从理论上讲,应该可以进行多次读取和一次写入。如何在Java中执行此操作?有可能吗?

谢谢!


答案 1

我可以使用一个信号量来锁定所有读取和写入,但我认为这表现不佳。

关于性能,永远不要思考。始终测量。

也就是说,这就是您正在寻找的。java.util.concurrent.locks.ReentrantReadWriteLock


答案 2

文件的部分锁定是一项复杂的业务,许多操作系统都避免这样做。但是,如果您坚持这样做,一种方法是设计自己的锁定机制对象,该对象记录文件的哪些部分被锁定。实质上,在读取或写入对象之前,必须为文件的特定字节范围请求锁定。如果锁在字节范围内完全重叠,则认为它们会发生冲突。读锁和写锁的处理方式不同:读取可以安全地与任意数量的读锁定重叠,但写锁定必须与没有其他锁重叠,读取或写入。如果无法获取锁定,是等待还是中止,以及在写入等待时是否阻止读取,有很多问题,但只有您可以回答有关应用程序的问题。

鉴于其复杂性,最好锁定整个文件。检查您是否获得足够的性能 - 不要忘记,只要没有写入,就可以一次允许多次读取。