Java 在同步块中锁定自己的对象时出现问题

Java 在同步块中锁定自己的对象时出现问题,java,Java,我有一个类,我在该类中为同一个类对象创建同步锁 例如 然后它给出了堆栈溢出错误,但我编写的代码与 class Demo{ private static Demo obj=new Demo(); synchronized(obj){ //some code here } } 然后它就可以正常工作了,所以请任何一个人在那里逻辑地向我解释这里发生了什么。这与同步无关。您将遇到与此代码完全相同的问题: class Demo { private Demo

我有一个类,我在该类中为同一个类对象创建同步锁 例如

然后它给出了堆栈溢出错误,但我编写的代码与

class Demo{
    private static Demo obj=new Demo();
    synchronized(obj){
         //some code here
    }
}

然后它就可以正常工作了,所以请任何一个人在那里逻辑地向我解释这里发生了什么。

这与同步无关。您将遇到与此代码完全相同的问题:

class Demo {
    private Demo obj=new Demo();
}
你是说为了创建一个
Demo
的实例,你需要创建一个
Demo
的新实例-这将创建另一个
Demo
的新实例。在你的
static
版本中,只有一个静态字段,初始化一次,所以你不会得到这个无限递归

如果您希望某些代码在自身上同步,可以使用
this

synchronized(this) {
    ...
}
就我个人而言,我建议在一个从未曝光过的单独对象上进行同步:

public class Demo {
    private final Object lock = new Object();
    ...
    // In a method
    synchronized(lock) {
        ...
    }
}

当你知道唯一知道这个引用的东西是
Demo
对象本身时,就更容易对锁进行推理了。

Class
的拼写错误吗?@Sahil看看历史,这就是它的来龙去脉-我刚刚点击了格式化哦,对不起@MadProgrammer
public class Demo {
    private final Object lock = new Object();
    ...
    // In a method
    synchronized(lock) {
        ...
    }
}