我有聚合器类,它会在一段时间内累积一些数据。现在,在此之后,它已经关闭接受新数据并且能够产生一些聚合结果(可能由另一个线程计算而不是执行聚合的线程)。这是它的样子:
public class Aggregator{
private volatile boolean closed;
private Collection<Integer> data = new LinkedList<>();
private int counter;
private final Object mutex = new Object();
public void close(){
closed = true;
}
public boolean isClosed(){
return closed;
}
public void add(Integer i){
if(!closed){
synchronized(mutex){
if(__some_complex_condition__)
++counter;
data.add(i);
}
}
}
public Intger compute(){
if(closed){
synchronized(mutext){ } //<----- IS IT SAFE???
//to ensure data-visibility
Integer retVal;
//perform computation on data and counter
return retVal;
}
return null;
}
}
使用空的同步块来确保数据一致性是否可靠?我想是的,只要这个类的合同告诉我们一旦Aggregator
关闭就不会接受新的数据,如果它仍然无法计算价值开。
但我对此并不十分肯定。也许JVM
只是选择空闲同步块,我会遇到大麻烦......