java io读写锁

use*_*631 2 java

假设我有一个文件可能由一个线程/进程Writer写入并由另一个线程/进程Reader读取.Writer每隔x个时间间隔更新一次文件,Reader会每隔y个时间间隔读取一次文件,如果它们碰巧同时读写文件,会有任何问题吗?在写完成之前,读取块会被阻塞吗?或读取失败?反之亦然?这里的最佳做法是什么?

eri*_*son 5

您需要设计自己的锁定协议以在应用程序中实现.具体取决于底层操作系统,但一般来说,即使另一个进程正在写入文件,也不会阻止一个进程读取文件.

Java有一个FileLock类可用于协调对文件的访问.但是,您需要仔细阅读注意事项,尤其是与此功能的系统相关性有关的注意事项.在目标操作系统上测试功能非常重要.

Java的一个关键概念FileLock是它只是"建议性的".您的进程应该能够检测到另一个进程持有对文件的锁定,但您的进程可以忽略它并使用该文件执行它喜欢的操作,没有任何限制.

问题是多个进程是使用该文件还是仅在单个Java进程中单独的线程是不明确的.这是一个很大的不同.如果问题只需要在单个流程中保证线程安全,那么a ReentrantReadWriteLock可以提供强大,高性能的解决方案,而不会出现任何特定于平台的缺陷.