Я написал класс «Провайдер / Потребитель», который пытаюсь снова создать надежный параллелизм.
Мой вопрос касается обмена Value.Я бы подтвердил свой подход.Мне кажется, что это не слишком плохой подход тогда и только тогда, когда класс Value неизменен , верно?
Если класс Value не должен быть неизменным, должен ли он содержать некоторую блокировкумеханизмы?
class ModuleProvider implements Module {
Value value = Value.UNSET;
private final ReentrantLock computeLock = new ReentrantLock();
private final ReadWriteLock valueLock = new ReentrantReadWriteLock();
public void compute() {
if (computeLock.tryLock()) {
// Do some heavy computation
valueLock.writeLock().lock();
value = xyz;
valueLock.writeLock().unlock();
computeLock.unlock();
}
}
// Is this the correct way?
public Value getValue() {
valueLock.readLock().lock();
Value local = value;
valueLock.readLock().unlock();
return local;
}
}
class ModuleConsumer implements Module {
Value value = Value.UNSET;
private final ReentrantLock computeLock = new ReentrantLock();
private final ReadWriteLock valueLock = new ReentrantReadWriteLock();
Module provider;
public void compute() {
if (computeLock.tryLock()) {
Value v = provider.getValue();
valueLock.writeLock().lock();
value = Value.from(v);
valueLock.writeLock().unlock();
computeLock.unlock();
}
}
public Value getValue() {
return value;
}
public void exportTo(PriorityBlockingQueue<Message> queue) {
}
}