数组元素是否需要可变?如果是这样,我该怎么做?

does array elements need to be volatile? if so, how can I make it?

假设我没有像这样的代码:

public class Test {
    final Data[] dataArray;
    final int maxSize;
    volatile long nextWriteNo;
    volatile long nextReadNo;

    public Test(int maxSize){
        this.dataArray = new Data[maxSize];
        this.maxSize = maxSize;
        this.nextWriteNo = 0L;
        this.nextReadNo = 0L;
    }

    public void write(Data data){
        synchronized (this) {
            dataArray[(int)(nextWriteNo & (maxSize - 1))] = data;
            nextWriteNo = nextWriteNo + 1L;
        }
    }

    public Data read(Data data){
        synchronized (this) {
            Data data = dataArray[(int)(nextReadNo & (maxSize -1))];
            nextReadNo= nextReadNo + 1L;
            return data;
        }
    }
}

其中一个线程将多次调用 write() 方法,而另一个线程将多次调用 read() 方法。 write() 方法更新数组,而 read 方法读取数组。所有发生在 synchronized 块内。那么为了可见性,或者发生在关系之前,数组元素(对象引用)是否需要 volatile?如果可以,我该怎么做?

没有理由在同步块中使用 volatile。块本身保证值的状态在读取和写入之间保持一致。