我有一个问题,
之间有什么区别StringBuilder sb = new StringBuilder();
public void sync(){
synchronized(sb){
};
}
和
public void sync(){
synchronized(this){
};
}
答案 0 :(得分:6)
在第一种情况下,您锁定“sb”变量,在第二种情况下,锁定“this”对象。 这很明显,但我想你想知道哪个更好。
嗯,第一种情况更好,因为你锁定了一个局部变量(考虑将其设为私有)并且你很确定没有其他人会锁定它而不是你。 如果您锁定“this”,任何其他线程都可以使用此对象锁定,从而阻止您运行同步代码(而您可以安全地运行)。
答案 1 :(得分:0)
语法完全相同。在这两种情况下,您都在使用特定引用进行同步 - synchronized块将获取与引用所引用的对象关联的监视器。在这两种情况下,如果其他线程尝试获取同一对象的监视器,则会阻塞其他线程,直到原始线程释放监视器。
仅在第一种情况下,引用为sb
,在第二种情况下为this
。 this
的值只是一个引用,就像任何其他引用一样(保证不为null)。
答案 2 :(得分:0)
在java中,同步是围绕一个名为monitor的概念完成的。 synchronized
的参数是您要锁定的监视器。