像往常一样,我们使用这样的同步:
Class A{
public void method1{
syncronized(this){
}
}
public void method2{
syncronized(this){
}
}
}
有一天,我找到了这样的代码:
Class B{
public void method3{
syncronized(B.class){ //class level lock but lock itself
}
}
}
Class C{
public void method4{
syncronized(B.class){/class level lock but lock other class
}
}
}
如在C类中所示,它使用B.class作为其监视器。假设有两个线程t1和t2访问C类实例C1,而线程t3访问B类实例B1,当t1访问C1时,是否对实例B1或B类有任何影响? B.class的角色是B类中的“this”这样的监视器吗?
答案 0 :(得分:0)
如果你在生产代码中看到这种东西,那么你可能遇到了问题。但是,它相对容易理解。
B的类实例用于同步B.method3()
和C.method4()
。因此,一次只有一个控制线程可以进入这些方法中的任何一个,无论它被调用的实例如何。没有其他影响,除非你有更多的事情在B的班级实例上同步。由于这个原因,这是一个非常钝的武器 - 你可以做得很好确保B.class上还有其他什么可能同步,因此您获得的序列化级别没有明确定义。
但是,它不是一个正确的全局JVM级同步--B.class的不同实例可以存在于不同的类加载器中,所以如果你这样做,你需要非常小心你期望发生什么疯狂。如果您正在尝试保护一次只能由一件事访问的全局资源,您可能需要考虑另一种方法。
从更一般的角度来看,在B和C之间创建这种依赖关系是一个坏主意。它根本不清楚为什么 C应该有一个方法同步在B.class等等,随着时间的推移,这个原因可能会丢失。 B
中的更改完全有可能意味着C
不再需要(或甚至不适合)B
以这种方式同步,但您和#39;没有办法知道。