Java中未同步的getter/setter行为

3

我有一个类,它作为另一个类的代理。

public class Delegate {

    private AnotherClass ac;

    public void delegateCall() {
        this.ac.actualCall();
    }

    public void setAC(AnotherClass ac) {
        this.ac = ac;
    }
}

如果我有很多线程调用delegateCall(),而另一个线程调用setAC()会发生什么后果?我的假设是,在设置ac实例之前,一些调用delegateCall()的线程将获得对它的访问权,而另一些线程在设置之后才能访问它。在我的特定应用程序中,每个线程获得哪个实例并不重要。
我的问题是:JVM内部是否存在任何潜在的同步,可能导致调用delegateCall()的线程阻塞?
2个回答

3

不,这里没有任何阻塞的东西。同时也没有保证“读取”线程会永远看到对ac的更改。实际上,它几乎肯定会看到,但这并不是保证(因为代码中没有涉及“happens-before”障碍)。当然,这在您的情况下可能是可以接受的。


0

阅读了您的任务描述后,我认为您可能会对使用对象池感兴趣。

正如Jon所说,在您的代码中,没有任何防止出现NullPointerException的措施。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接