我想知道这两个场景在多线程环境中是否等效。
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 ) {
}
我认为第一种情况在多线程环境中存在竞争条件,因为如果线程 A在线程 B 调用 removeListener()之前调用 addListener() 方法,即使线程 A 调用 addListener ,线程 B 仍然有可能在线程 A 之前获取锁() 在线程 B 调用 removeListener() 之前。这个假设是正确的还是Java保证在线程被调度出来之前至少会执行该方法的一个语句。