我有多个应用程序在一个虚拟机中运行。我在一台服务器上运行多个虚拟机。我有多个服务器。他们都使用 linux 上的共享文件夹共享一个文件。该文件由所有应用程序读取和写入。在写入过程中,不允许任何应用程序读取此文件。写入也是如此:如果应用程序正在读取文件,则不允许任何应用程序写入它。
我如何设法同步应用程序,以便它们在读取之前等待写入过程完成,反之亦然? (虚拟机内的应用程序必须同步,跨服务器的应用程序也必须同步)
当前实现使用“文件信号量”。如果文件即将写入,应用程序会尝试通过在共享文件夹中创建一个附加文件(我们将其命名为“file.semaphore”)来“获取”信号量。如果“file.semaphore”文件已经存在,这意味着信号量已经被不同的应用程序锁定。这种方法有一个问题,我无法确保“文件存在”- 测试和“创建文件”- 操作是原子执行的。这样,两个应用程序就可以测试“file.semaphore”文件,发现它不存在并尝试同时创建该文件。
最佳答案
您可以使用 NIO 锁定功能。参见 FileChannel#lock() .
但是,这仅在底层文件系统支持通过网络锁定时才有效。最近的 NFS 应该支持它。可能,Samba 也支持它们,但不能确定。
参见 article例如。
关于java - 如何使用 Java 同步共享文件夹中的文件访问(或 : ReadWriteLock on network level),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/320159/