有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java非易失性多线程写入,线程可见

我有一个变量,我需要设置我希望线程可见的值。我不知道什么样的线程在读写

变量只设置一次,通过将其设置为volatile我防止从CPU缓存读取变量值(或者我的理解是这样的)。写一次,读很多

我无法将此变量放入构造函数以使用final

我的大致流程是:

thread 1: set value x
thread 1: fire notification to say x is ready.
thread 2: read x.

我的理解是,我可以做到以下几点:

public void setX(int value) {
    Object o = new Object();
    synchronized(o) {
        this.x = value;
    }
}

由于“先发生后发生”原则,该值将被写入内存。对吗


共 (2) 个答案

  1. # 1 楼答案

    不要将其设置为volatile。根据经验,如果变量的值正在更改,并且多个线程对该变量进行了读/写操作,请使用volatile。在你的例子中,你希望读取被缓存。因为x的值不会改变。使用volatile将降低性能在您的情况下,您只需确保set()发生在get()之前。这实际上会发生,因为除非someThread通知另一个线程,否则另一个线程不会读取x的值

    PS:我假设其他线程不会读取x的值,除非得到通知。如果我误解了你的问题,请告诉我

  2. # 2 楼答案

    在方法中创建的对象上同步是没有意义的。 你如何notify()所有阅读线程是一个你需要自己回答的问题——你打算让他们wait()为这个通知做准备吗? 如果尚未设置值,我建议从getter返回nullthrow