gpt4 book ai didi

java - 非最终字段的同步

转载 作者:IT老高 更新时间:2023-10-28 11:46:30 29 4
gpt4 key购买 nike

每次我在非最终类字段上同步时都会显示警告。这是代码:

public class X  
{
private Object o;

public void setO(Object o)
{
this.o = o;
}

public void x()
{
synchronized (o) // synchronization on a non-final field
{
}
}
}

所以我按以下方式更改了编码:

 public class X  
{

private final Object o;
public X()
{
o = new Object();
}

public void x()
{
synchronized (o)
{
}
}
}

我不确定上面的代码是否是在非最终类字段上同步的正确方法。如何同步非最终字段?

最佳答案

首先,我鼓励您真正努力在更高的抽象级别上处理并发问题,即使用 java.util.concurrent 中的类来解决它。例如 ExecutorServices、Callables、Futures 等。

话虽如此,在非最终字段本身上进行同步并没有错误。您只需要记住,如果对象引用发生更改,同一段代码可能会并行运行。即,如果一个线程运行同步块(synchronized block)中的代码并且有人调用 setO(...),另一个线程可以在 相同的同步块(synchronized block)上运行 相同实例并发。

同步您需要独占访问的对象(或者,更好的是,专用于保护它的对象)。

关于java - 非最终字段的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6910807/

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