Я хочу знать, эквивалентны ли эти два сценария или нет в многопоточной среде.Явская эквивалентность внутренней и явной глобальной блокировки
private final Lock globalLock = new ReentrantLock();
Сценарий 1
public void addListener(Listener listener) {
globalLock.lock();
try{
//blah blah
}finally {
globalLock.unlock();
}
}
public void removeListener(Listener listener) {
globalLock.lock();
try{
//blah blah
}finally {
globalLock.unlock();
}
}
Сценарий 2
public synchronized addListener(Listener listener) {
}
public synchronized removeListener(Listener listener) {
}
Я думаю, что первый сценарий имеет условия гонки в многопоточной среде, потому что если тема А вызывает метод добавления слушателя() перед тем тему B вызывает removeListener(), все еще существует вероятность того, что Thread B получит блокировку до Thread A, хотя Thread Invo ked addListener() до того, как Thread B вызывается removeListener(). Является ли эта гипотеза правильной или Java гарантирует, что по крайней мере один оператор метода будет выполнен до того, как Thread будет запланирован.
Да, globalLock - глобальное конечное поле –
Ситуация, о которой вы описали, не является условием гонки. Вызовы addListener и removeListener из разных потоков не могут рассматриваться в терминах «раньше» или «после». –