数组元素是否需要可变?如果是这样,我该怎么做?
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
。块本身保证值的状态在读取和写入之间保持一致。
假设我没有像这样的代码:
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
。块本身保证值的状态在读取和写入之间保持一致。