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

问题描述 投票:0回答:1

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

java multithreading filesystems synchronized
1个回答
1
投票

FileLock API反映了你的操作系统对文件锁定的任何功能。它的目的是锁定对文件的访问。系统上运行的所有进程不仅仅是你的虚拟机。你所说的 "另一个线程2等待线程1完成工作 "的方式听起来像是你想要在你自己的虚拟机中使用锁(即你所说的 "线程 "是你的代码)。因为FileLock镜像了操作系统,所以它是很脆弱的--根据你运行的平台不同,它的工作方式也不同,这使得测试成为一场噩梦。

你不应该使用它 如果你的目的只是为了管理自己应用程序的线程。

首先是个坏消息。你想要的东西并不存在 - 没有目录级的锁,它的作用就像文件锁一样,可以锁住所有的文件,也可以在操作系统层面上使删除目录内的任何东西,因此java也没有这个功能。

现在好消息来了。但你并不想要它 - 和你想要的 是否 你只是想要..: 你只是想要... 锁,很简单。你可以使用java API中的各种canonicalizing paths方法,如 Path.toRealPath() 以最终得到 "真实 "路径,然后使用while循环重复调用 Path.getParent() 来构建一堆对象,代表任何文件所涉及的父路径。

Java有锁的功能,比如 ReentrantReadWriteLock (那个包也包含了更简单的锁功能,而java.util.concurrent一般也包含了类似锁的构造,比如latches)。

现在剩下的就是把这两个概念绑在一起。你将不得不决定如何将一个(父)目录映射到一个锁,以及为了对一个文件进行操作需要持有哪些锁。你可以使用 ConcurrentHashMap 绘制 Path 对象 LockReentrantLock 对象,也许。

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

© www.soinside.com 2019 - 2024. All rights reserved.