2013-07-01 44 views
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 
    } 
} 

然后正常工作,所以请任何一个有逻辑地解释我这里发生了什么。

+0

'Class'是'class'的一个错字吗? – johnchen902

+0

@Sahil看看历史吧,就是这样来的吧 - 我只是打格式 – MadProgrammer

+0

对不起哦@MadProgrammer – Sahil

回答

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

+0

谢谢@Jon Skeet – Sahil