Java中的非同步getter / setter行为

时间:2010-03-09 15:56:24

标签: java multithreading concurrency synchronization

我有一个课程,作为另一个人的代表。

public class Delegate {

    private AnotherClass ac;

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

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

如果我有很多线程调用delegateCall()而另一个线程调用setAC(),会有什么后果?我的假设是调用delegateCall()的某些线程在设置之前可以访问ac实例,并且有些线程在设置之后可以访问它。在我的特定应用程序中,每个线程获得哪个实例并不重要。

我的问题:JVM中是否存在可能导致调用delegateCall()的线程阻塞的基础同步?

2 个答案:

答案 0 :(得分:3)

不,这里没有任何阻碍。也没有什么可以保证“读者”线程永远看到对ac的更改。实际上它几乎肯定会,但它不能保证(因为你在这里展示的代码中没有“先发生过”的障碍。当然,这对你的情况来说可能是好的。

答案 1 :(得分:0)

在阅读完任务说明后,我认为您假设使用Objects Pool会感兴趣。

在你的代码中,正如Jon所说,没有什么能阻止你获得NullPointerException。