Java 同步块与"this"和方法参数的工作方式是否相同?



如果在同步块中使用方法参数而不是this关键字,Java同步的行为如何。

public void doSomething(final MyInterface iface) {
  synchronized(this) {
    // ... do some work
  }
}

public void doSomething(final MyInterface iface) {
  synchronized(iface) {
    // ... do some work
  }
}

净效果会是一样的吗?

这两种情况完全不同。

使用synchronized时,将在作为参数传递的对象上获得锁(监视器)。

synchronized(this)-->线程获取对"当前"对象的锁定。

synchronized(iface)-->线程获取对"iface"对象的锁定

净效果会是一样的吗?

不,效果可能会大不相同。

你读过JLS吗?this关键字上的同步意味着对象本身(在其上调用了方法)上的同步。很明显,this对象和参数引用的对象在一般情况下是不一样的。

最新更新