【发布时间】:2015-11-13 08:07:37
【问题描述】:
我有以下将被多个线程使用的类:
public class Container
private volatile Date date;
private int amount;
private final Object lock = new Object();
public void update(int amount){
int actualAmount;
if(check(date)){
//do some BULK computation to compute the actualAmount
synchronized(lock){
date = new Date();
this.amount = actualAmount;
}
}
}
private boolean check(Date date){
synchronized(lock){
//reading from the date and returning true if the date is expired
}
}
}
但我不确定正确性。首先,我将Date 字段声明为volatile,以便在执行条件检查时观察变化。但可能会发生在进行批量计算时,第二个线程试图执行更新导致数据竞争。
我不想将BULK 计算放入同步块中,因为它包括调用几个外来方法并阻止 JVM 进行优化。
执行两次批量计算不会对数据结构造成损害,但会浪费处理器的时间。
我应该如何以更有效的方式处理这个问题?
【问题讨论】:
标签: java multithreading synchronization