你们认为这是一个很好的原子操作通用框架吗? 您是否也认为对于Java应用程序而言,单个字节代码是原子的,因为使用单个JVM无法一次执行多个字节代码?所以如果if else有一个单字节代码,那么这个if else指令将是原子的吗?
// CAS, Compare and Swap
public abstract class CASOperation<T> {
protected T valueAtStart;
public CASOperation(){
valueAtStart = objectToReview();
}
public void exec(){
synchronized(this){
while(!valueAtStartEqualsTheCurrent()){
valueAtStart = objectToReview();
}
execImp();
}
}
private boolean valueAtStartEqualsTheCurrent() {
if (objectToReview().equals(valueAtStart)){
return true;
} else {
return false;
}
}
abstract protected T objectToReview();
abstract protected void execImp();
它实际上是一个比较和执行框架,因此在检查原始捕捉值没有改变之后,我们执行一些代码块。
答案 0 :(得分:8)
我只会使用java.util.concurrent.AtomicReference
,除非你真的需要完全相等的检查,而不是简单的==
。
compareAndSet
返回一个值,说明该值是否为预期值,因此您可以有条件地执行其他代码。
在同步块中执行抽象方法听起来像是一个有潜在风险的业务 - 没有迹象或约束可能需要多长时间。
这样说:我认为除非我知道特定的要求使用类似你提议的框架的东西,否则我会坚持使用java.util.concurrent.atomic
中的类型。
答案 1 :(得分:1)
你们认为这是一个很好的原子操作通用框架吗?
是的,它位于java.util.concurrent.atomic包中。
如果“if else”有一个单字节代码,那么这个“if else”指令是原子的吗?
不一定 - 一个字节码指令可能会转换为多个机器指令。
注意:您的代码使用的是一个从未在一次调用中释放的synchronized块 - 因此,如果在进入块时条件为false,则可能永远不会成为真。