Java中的分层互斥锁

Sco*_*zer 11 java multithreading mutex locking

我希望能够基于文件系统层次结构进行锁定.例如:

线程1:

lock("/");
doStuff();
unlock();
Run Code Online (Sandbox Code Playgroud)

线程2:

lock("/sub/foo");
doStuff();
unlock();
Run Code Online (Sandbox Code Playgroud)

线程3:

lock("/sub/bar");
doStuff();
unlock();
Run Code Online (Sandbox Code Playgroud)

如果线程1首先获得锁定,则线程2和3将被阻塞,直到线程1解锁.但是,如果线程2首先获取锁,则线程3应该能够与线程2同时执行.一般规则是如果父目录上有锁,则线程必须阻塞.

Java有内置的东西可以帮助解决这个问题吗?我想避免为每个目录存储一个锁,因为会有数十万个目录.

usr*_*usr 7

我将目录路径存储在树中,如下所示:

- /
 - sub
  - foo
  - bar
Run Code Online (Sandbox Code Playgroud)

每当您需要锁定该树中的任何内容时,您都会从根目录下来并获取除目标节点本身之外的所有内容的读锁定.目标节点获得写锁定.

该方案保证了树的相关部分的死锁自由和稳定性.

我没有看到存储数十万个锁的特殊问题.这可能会浪费每个锁100个字节的RAM.但它简化了架构.你有没有测量它是否真的有问题?

作为替代方案,您可以拥有从路径到锁定的地图.该字典上的所有操作必须由呼叫者同步.这允许您懒惰地初始化锁.您还可以通过首先在根上执行写锁定来定期对未使用的锁进行垃圾收集,从而停止所有操作.一旦安静,您将丢弃所有非根锁.