Q:

Блокирует ли ReentrantLock весь объект или только часть кода?

У меня задача заблокировать объект если в него зашел хотя-бы один поток. Я хочу использовать ReentrantLock для этого.
И есть два метода которые под этим локом:
private final Lock monitor = new ReentrantLock();

public boolean update(final K idKey, final V newValue) {
    this.monitor.lock();
    try {
        // что-то там...
    } finally {
        this.monitor.unlock();
    }
}

public boolean add(final K idKey, final V newValue) {
    this.monitor.lock();
    try {
        // что-то там...
    } finally {
        this.monitor.unlock();
    }
}

Вопрос: если есть два потока, и поток номер 1 уже зашел в метод updateи что-то там делает, а поток номер 2 хочет зайти в это время в метод add, то потоку номер 2 придется ждать пока поток номер 1 не закончит? Или блокировано будет только тело метода update?

A:

ReentrantLock не блокирует ничего кроме потока, который вызвал lock() (если он занят другим потоком).
В вашем случае поток 2 будет заблокирован до тех пор, пока поток 1 не вызовет unlock(). При этом поток 1 может вызвать lock() многократно и он не будет блокироваться.

