【发布时间】:2015-11-11 06:00:57
【问题描述】:
我正在设计一个名为ConcurrentParamters 的线程安全容器类。这是我倾向于写的:
接口:
public interface Parameters {
public <M> M getValue(ParameterMetaData<M> pmd);
public <M> void put(ParameterMetaData<M> p, M value);
public int size();
}
public interface ParameterMetaData<ValueType> {
public String getName();
}
实施:
public final class ConcurrentParameters implements Parameters{
private final Map<ParameterMetaData<?>, Object> parameters;
private final volatile AtomicInteger size; //1, Not compile
{
size = new AtomicInteger();
parameters = new ConcurrentHashMap<>();
}
public static Parameters emptyParameters(){
return new ConcurrentParameters();
}
@Override
public <M> M getValue(ParameterMetaData<M> pmd) {
M value = (M) parameters.get(pmd);
return value;
}
@Override
public <M> void put(ParameterMetaData<M> p, M value){
parameters.put(p, value);
size.incrementAndGet();
}
@Override
public int size() {
return size.intValue();
}
}
我尝试将代表大小的AtomicInteger字段设为final,以确保没有任何方法可以将字段指向另一个对象,并在构建过程中对其进行初始化。
但由于容器将被同时访问,我需要任何线程观察其他线程所做的更改。因此,我也尝试将其声明为volatile,以避免不必要的synchronization(我不需要互斥)。
我没有编译。为什么?有什么理由吗?以这种方式标记一个字段没有意义吗?我认为这很明智......也许它天生就不安全?
【问题讨论】:
标签: java multithreading concurrency final volatile