嵌套同步块的缺点

fer*_*hur 2 java multithreading synchronization synchronized

了解线程和并发性.请考虑以下代码:

class A {

  protected final Object lock = new Object();

  public void remove(Object obj){
    synchronized(lock){
      // remove the object
    }
  }

  public void add(Object obj){
    synchronized(lock){
      // add the object
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

此代码是线程安全的,因为没有两个不同的线程可以addremove当一个线程正在添加或删除过程中.

现在考虑A的以下sublcass:

class B extends A {

  public void update1(Object original, Object newObj){
    remove(original);
    add(original); 
  }

  public void update2(Object original, Object newObj){
    synchronized(lock) {
      remove(original);
      add(newObj);
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

B必须实现线程安全的update方法.现在,据我所知,update1这不是线程安全的,因为操作不是原子的,即执行remove和之间没有同步add(如果错误则纠正我).

update2实现线程安全update方法的正确方法吗?嵌套同步块是否有任何缺点lock

Mar*_*nik 7

update2实现线程安全更新方法的正确方法吗?

是的.您已达到原子性,并且您与个人addremove方法的调用者兼容.

在同一个锁上嵌套同步块有什么缺点吗?

不,因为锁是可重入的,这意味着第二次采集除了记住再次获取锁之外没有做任何事情,因此在执行两次释放操作之前它不会被释放.