gpt4 book ai didi

java - 在同步块(synchronized block)中锁定自己的对象时出现问题

转载 作者:行者123 更新时间:2023-12-02 20:02:47 25 4
gpt4 key购买 nike

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

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
}
}

然后它就可以正常工作了,所以请有人从逻辑上向我解释这里发生了什么。

最佳答案

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

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 对象本身时,就可以更轻松地推理锁。

关于java - 在同步块(synchronized block)中锁定自己的对象时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17398167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com