java - 如何使用 Java 同步共享文件夹中的文件访问(或 : ReadWriteLock on network level)

标签 java synchronization file-access

我有多个应用程序在一个虚拟机中运行。我在一台服务器上运行多个虚拟机。我有多个服务器。他们都使用 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/

相关文章:

java - 算法:从多个有序列表中搜索递增的整数序列

java - 为什么java tcp服务器接受关闭的套接字?

java - Findbugs "Method ignores exceptional return value"java.io.File.mkdirs()

Test and Set 是否可以在没有硬件支持的情况下用软件实现?

安卓10 : What are my options to save files on external storage into a directory called "/sdcard/my-app/"

java - 用于访问本地文件系统的 Applet 框架

java - 如何将 Java 对象从一个类传递到另一个类

java - 为什么StringBuffer的readObject不同步?

python - 如何根据传递给 open() 的参数以不同方式模拟打开

go - 初始化映射元素,其中 value 是带有互斥锁 golang 的结构体