我希望从持有写锁的线程向ForkJoinPool或ParallelArray提交任务。通过检查当前线程是否持有相关锁来保护对域模型的访问。为了允许FJ工作人员在上面执行任务(只读,例如查询),他们需要将访问检查委托给生成它们的线程。
我对ForkJoinWorkerThread进行了子类化,并引用了生成线程。然后,我子类化了ReentrantReadWriteLock并重写了isWriteLockedByCurrentThread来执行通常的检查,然后返回到一个检查,如果线程是委托FJWorker的实例,那么委托线程(父线程)是锁的所有者,使用ReentrantReadWriteLock。
public class DelegateAwareReentrantReadWriteLock extends ReentrantReadWriteLock {
@Override
public boolean isWriteLockedByCurrentThread() {
return super.isWriteLockedByCurrentThread() || isWriteLockedByDelegateThread();
}
private boolean isWriteLockedByDelegateThread() {
final Thread currentThread = Thread.currentThread();
if (currentThread instanceof FJAccessDelegatingWorker) {
final Thread delegate = ((FJAccessDelegatingWorker) currentThread).getDelegate();
return delegate.equals(getOwner());
}
return false;
}
}然而,getOwner()文档声明如下:
当非所有者的线程调用此方法时,返回值反映当前锁状态的最佳逼近。例如,即使有线程试图获取锁,但尚未获得锁,所有者也可能暂时为空。
我想要理解这意味着,如果我在一个已经被授予访问权限的线程中提交了任务,这个方法将正确地返回对它的引用。不幸的是,这一点甚至没有暗示。
如果我不能使用这种方法,对于这种委托还有什么其他的选择吗?
谢谢。
发布于 2012-03-02 01:04:39
我设想getOwner()的实现细节是这样的,如果在获得写锁的线程与查询所有者的线程之间的关系发生之前,它将具有确定性行为,以确保返回正确的所有者。我没有检查实现,但感觉这就是注释所暗示的,并且涵盖了在获取锁时行为可能是不确定的基础。
但是,如果您可以降低写锁的级别,并避免从一开始就进行所有委托检查(从那时起,每个线程都可以拥有自己的读锁),那么就更容易了。也许也可以使用两种不同的锁,比如外部锁和内锁,在这种情况下,内部锁不是用来写入的?
编辑: getOwner()的实现调用getState(),它对易失性状态变量进行读取,这应该足以保证如果getOwner()持有写锁,它将始终返回父线程。
https://stackoverflow.com/questions/9526309
复制相似问题