gpt4 book ai didi

java - 如果满足条件,则以原子方式写入两个变量

转载 作者:搜寻专家 更新时间:2023-11-01 03:19:54 25 4
gpt4 key购买 nike

我有以下将被多个线程使用的类:

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 计算放入同步块(synchronized block)中,因为它包括调用几个外来方法并阻止 JVM 进行优化。

执行两次批量计算不会对数据结构造成损害,但会浪费处理器的时间。

我应该如何以更有效的方式处理这个问题?

最佳答案

当批量计算完成并且另一个线程在此期间更改了金额时,我们别无选择,只能重新计算金额(重新运行此批量操作),对吗?

    public void update(int amount) {
int actualAmount;
if (check(date)){
//do some BULK computation to compute the actualAmount
synchronized(lock) {
if (check(date)) {
date = new Date();
this.amount = actualAmount;
} else {
update(amount);
}
}
}
}

当两个线程执行这个批量操作并且其中一个应该重新运行时,这不是浪费 CPU 时间吗?

累积此更新(数量)并在某些线程需要读取正确数量然后重新计算它(运行批量操作)时可能更有效。

哪个线程将读取这个数量?是否需要最新信息?了解答案可能有助于设计更好的解决方案。

更新 1。顺便说一句,可能需要一遍又一遍地进行这种递归重新计算。所以最正确的方法是将整个 update() 主体包装到 synchronized 语句中。

关于java - 如果满足条件,则以原子方式写入两个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33688183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com