Java线程锁定静态方法

时间:2013-08-17 13:13:32

标签: java

根据我在Java类中的知识

  
      
  1. 非静态同步方法:锁定获取特定对象
  2.   
  3. 静态同步方法:锁定类上的获取
  4.   

我对此有点困惑,因为我们可以通过类名或对象名称来调用静态方法。

请假设有4个方法,我的班级都是同步的。 2种方法是静态的,2种是非静态的。如果我将创建我的类“obj1”的1个对象,并且还有2个线程Thread1和Thread2

问题1:如果我将尝试使用obj1(或类名)访问静态同步方法。这是否意味着“obj1”没有锁定只会锁定2个静态方法(类级别锁定)?是指其他线程可以同时使用“obj1”来访问非静态方法而不是静态方法吗?

问题2:如果我将尝试使用Thread1中的obj1来访问非静态同步方法。这是否意味着Thread2只锁定了2个方法?意味着Thread2可以访问2个静态方法,或者我们可以同时使用className(MyClass)访问静态方法

问题3:如果我班级中的所有方法都是静态的并且是同步的。这是否意味着没有对象级别锁定,并且所有线程只有一个类级别锁定。 ?

请解释一下关于班级锁定的一点

提前致谢。

1 个答案:

答案 0 :(得分:12)

即使用

调用静态方法
someObject.staticMethod()

它不会改变锁定在Class对象上的事实。它只是意味着你以一种令人困惑的方式调用静态方法,你应该正确地调用它。仅仅因为它运行得很好,并不意味着它应该被使用(除非你打算让你的代码不那么可读)。

类级别锁没有什么特别之处。它只使用Class对象而不是实例,并且因为所有静态同步都使用相同的Class对象,所以它的工作方式就像它一样。

至于你的上一个问题,是的。如果你只有静态同步方法,那么无论你创建了多少个类实例,它们都将共享Class对象作为它们的锁。