Я хочу отправить задачи в 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 () гласит следующее:
Когда этот метод вызывается
поток, который не является владельцем, возвращаемое значение отражает
наилучшее приближение текущего состояния блокировки. Например,
владелец может на мгновение быть нулевым, даже если есть
потоки пытаются получить блокировку, но еще не сделали этого.
Я хотел бы понять, что это означает, что если я отправил задачи в потоке, которому уже был предоставлен доступ, этот метод правильно вернет ссылку на него. К сожалению, это даже не подразумевается.
Если я не могу использовать этот метод, какие существуют альтернативы для такого рода делегирования?
Спасибо.