Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于静态方法的Java线程锁_Java - Fatal编程技术网

基于静态方法的Java线程锁

基于静态方法的Java线程锁,java,Java,根据我在Java课堂上的知识 非静态同步方法:在特定对象上获取锁 静态同步方法:类上的锁获取 我对此有点困惑,因为我们可以通过类名或对象名来调用静态方法 请假设有4个方法是我的类都是同步的2个方法是静态的,2个是非静态的。如果我将创建一个类“obj1”的对象,并且有两个线程Thread1和Thread2 问题1:如果我尝试使用obj1(或类名)访问静态同步方法。这是否意味着在“obj1”上没有锁定只有2个静态方法将被锁定(类级锁定)?意味着其他线程可以同时使用“obj1”访问非静态方法,但不能访

根据我在Java课堂上的知识

  • 非静态同步方法:在特定对象上获取锁
  • 静态同步方法:类上的锁获取
  • 我对此有点困惑,因为我们可以通过类名或对象名来调用静态方法

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

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

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

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

    请解释一下类级锁


    提前谢谢

    即使使用

    someObject.staticMethod()
    
    它不会改变锁位于类对象上的事实。这只是意味着您正在以一种令人困惑的方式调用静态方法,您应该正确地调用它。仅仅因为它工作得很好,并不意味着应该使用它(除非您打算降低代码的可读性)

    类级锁没有什么特别之处。它只使用类对象而不是实例,而且由于所有静态同步都使用同一个类对象,因此它的工作方式与它的工作方式相同


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

    使用specific比使用类或实例来锁定要好。@HoverCraftFullOfels优秀用户名!:-)