Защита обмена объектами в многопоточной среде - PullRequest
0 голосов
/ 13 февраля 2019

Я написал класс «Провайдер / Потребитель», который пытаюсь снова создать надежный параллелизм.

Мой вопрос касается обмена 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) {

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...