基本的java同步

时间:2011-07-14 12:11:20

标签: java synchronization

我有一个问题,

之间有什么区别
StringBuilder sb = new StringBuilder();
public void sync(){
  synchronized(sb){
  };
}

public void sync(){
  synchronized(this){
  };
}

3 个答案:

答案 0 :(得分:6)

在第一种情况下,您锁定“sb”变量,在第二种情况下,锁定“this”对象。 这很明显,但我想你想知道哪个更好

嗯,第一种情况更好,因为你锁定了一个局部变量(考虑将其设为私有)并且你很确定没有其他人会锁定它而不是你。 如果您锁定“this”,任何其他线程都可以使用此对象锁定,从而阻止您运行同步代码(而您可以安全地运行)。

答案 1 :(得分:0)

语法完全相同。在这两种情况下,您都在使用特定引用进行同步 - synchronized块将获取与引用所引用的对象关联的监视器。在这两种情况下,如果其他线程尝试获取同一对象的监视器,则会阻塞其他线程,直到原始线程释放监视器。

仅在第一种情况下,引用为sb,在第二种情况下为thisthis的值只是一个引用,就像任何其他引用一样(保证不为null)。

答案 2 :(得分:0)

在java中,同步是围绕一个名为monitor的概念完成的。 synchronized的参数是您要锁定的监视器。