2

我有一个类,我在该类中为同一个类对象进行同步锁定例如。

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

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

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

然后它工作正常,所以请任何人在那里从逻辑上解释我这里发生了什么。

4

1 回答 1

9

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

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对象本身时,就更容易推理锁了。

于 2013-07-01T05:56:01.843 回答