同步文件夹访问(锁定)java

Synchronize folder acess (lock) java

我使用线程,我希望如果线程 1 在文件夹中执行任何工作,则另一个线程 2 会等待直到线程 1 完成其工作。有什么方法可以锁定对文件夹的访问,就像 FileLock 来自 java.nio?

FileLock API 反映了文件锁定的 OS 功能。它的要点是锁定对文件 的所有进程 运行ning 在您的系统 上的访问,而不仅仅是您的 VM。您谈论 'that another thread 2 waits until thread 1 is done with its work' 的方式听起来像是您想在自己的 VM 中锁定(即您所说的 'threads' 是您的代码)。因为 FileLock 镜像 OS,所以它很挑剔 - 它的工作方式不同,具体取决于您的 运行 在哪个平台上,这使得测试成为一场噩梦。

如果您的目的仅仅是管理您自己的应用程序的线程,则不应使用它

首先是坏消息:你想要的不存在 - 没有目录级锁定,就像对所有文件的文件锁定一样 making/deleting OS 级别目录中的任何内容,因此 java 也没有。

好消息是:但你并不想要它 - 而你想要的确实存在:你只是想要.. 锁,简单明了。您可以使用 java API 中的各种规范化路径方法,例如 Path.toRealPath() to end up with 'real' paths, and then use a while loop to repeatedly call Path.getParent() 来构建代表任何文件所涉及的父路径的一堆对象。

Java 具有锁功能,例如 ReentrantReadWriteLock(该包也包含更简单的锁功能,并且 java.util.concurrent 通常包含类似锁的构造,例如闩锁)。

现在剩下的就是将这两个概念联系在一起。您将不得不决定如何将(父)目录映射到锁,以及需要持有哪些锁才能对文件进行操作。您可以使用 ConcurrentHashMapPath 对象映射到 LockReentrantLock 对象。

当然,在从 java 进行任何文件访问之前,您必须添加代码来解决锁定问题。如果你想要一个故障保护来检测你已经解决了所有问题,你可以安装一个 SecurityManager 如果你必须的话;这就像一个在任何磁盘访问之前调用的挂钩。