書き込みロックを保持しているスレッドから ForkJoinPool または ParallelArray にタスクを送信したいと考えています。ドメイン モデルへのアクセスは、現在のスレッドが関連するロックを保持していることを確認することで保護されます。FJ ワーカーがタスク (読み取り専用、クエリなど) を実行できるようにするには、それらを生成したスレッドにアクセス チェックを委任する必要があります。
生成スレッドへの参照を使用して、ForkJoinWorkerThread をサブクラス化しました。次に、ReentrantReadWriteLock をサブクラス化し、isWriteLockedByCurrentThread をオーバーライドして通常のチェックを実行し、スレッドがデリゲート FJWorker のインスタンスである場合は、ReentrantReadWriteLock#getOwnerを使用して、デリゲート スレッド (親) がロックの所有者であることをチェックします。 () :
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() のドキュメントには次のように記載されています。
このメソッドが所有者ではないスレッドによって呼び出された場合、戻り値は現在のロック ステータスのベスト エフォート近似を反映します。たとえば、ロックを取得しようとしているがまだ取得していないスレッドがある場合でも、所有者が一時的に null になることがあります。
これは、既にアクセスが許可されているスレッド内でタスクを送信した場合、このメソッドがそのスレッドへの参照を正しく返すことを意味することを理解したいと思います。残念ながら、これは暗示されていません。
この方法を使用できない場合、この種の委任には他にどのような方法がありますか?
ありがとうございました。