我有多个线程正在读取文件。文件路径包含一个符号链接,该链接由后台守护程序(不是Java应用程序)定期更新。
例如,考虑此文件路径/home/user/me/data/current/file.out
,current
是指向包含文件file.out
的实际目录的符号链接,current
定期更新守护进程。
Java线程只读取文件(不写入文件)。如何确保线程可以安全地读取文件?我正在考虑一个锁定机制,但我不能让守护进程在更新符号链接时设置锁。
提前致谢。
答案 0 :(得分:0)
我认为你不需要锁。您可以在更新链接时打开文件(除非在守护程序的atomic manner中完成),或者您可以。一旦Java应用程序打开了要读取的文件(如果链接没有以原子方式更新,可能会在几次尝试之后),是否移动,删除或重命名(文件的符号链接)无关紧要 - Java应用程序仍然可以读取该文件,因为Linux保留了Java应用程序可用的最初打开的文件(句柄/ inode)。
这也是为什么有时删除文件不会释放磁盘空间的原因:某些进程仍在使用它。仅当已删除文件的所有打开文件句柄都关闭时,已删除文件使用的磁盘空间才可用(免费)。