Параллелизм (ReentrantLock) в разных потоках

Мне нужно использовать ReentrantLock в разных потоках. Возможно ли это? PS Во втором методе "lock.unlock()" киньте IllegalMonitorStateException.

public class SomeClass {
    private static ConcurrentHashMap<String, String> hashMap = new ConcurrentHashMap<>();
    private final Lock lock = new ReentrantLock();

    public void firstMethod(Action action) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //SOME CODE BEFORE LOCK
                lock.lock();
                //SOME CODE AFTER UNLOCK
            }
        }).start();
    }

    public void secondMethod(Action action) {
        if (hashMap.get("key").length() == 3)
            lock.unlock();
    }
}

Изменить: Решено с java.util.concurrent.locks.Condition!

2 ответа

Это, безусловно, возможно, потому что вся структура блокировки предназначена для вызова различными потоками.

Вы получили ошибку во вторых потоках, потому что ваш метод не заблокировал объект Lock, вызвав lock.lock() перед его освобождением; таким образом, ваш поток не владеет блокировкой до ее разблокировки, что недопустимо.

Блокирующая нить также должна быть разблокируемой. Попытка решить ее любым другим способом приведет к гоночным условиям.

Другие вопросы по тегам