同步在其他类上

时间:2017-01-20 10:28:33

标签: java multithreading synchronization locking

像往常一样,我们使用这样的同步:

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”这样的监视器吗?

1 个答案:

答案 0 :(得分:0)

如果你在生产代码中看到这种东西,那么你可能遇到了问题。但是,它相对容易理解。

B的类实例用于同步B.method3()C.method4()。因此,一次只有一个控制线程可以进入这些方法中的任何一个,无论它被调用的实例如何。没有其他影响,除非你有更多的事情在B的班级实例上同步。由于这个原因,这是一个非常钝的武器 - 你可以做得很好确保B.class上还有其他什么可能同步,因此您获得的序列化级别没有明确定义。

但是,它不是一个正确的全局JVM级同步--B.class的不同实例可以存在于不同的类加载器中,所以如果你这样做,你需要非常小心你期望发生什么疯狂。如果您正在尝试保护一次只能由一件事访问的全局资源,您可能需要考虑另一种方法。

从更一般的角度来看,在B和C之间创建这种依赖关系是一个坏主意。它根本不清楚为什么 C应该有一个方法同步在B.class等等,随着时间的推移,这个原因可能会丢失。 B中的更改完全有可能意味着C不再需要(或甚至不适合)B以这种方式同步,但您和#39;没有办法知道。