Java Atomicity&一个好的比较和交换框架?

时间:2013-02-08 11:06:20

标签: java atomic bytecode atomicity

你们认为这是一个很好的原子操作通用框架吗? 您是否也认为对于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();

它实际上是一个比较和执行框架,因此在检查原始捕捉值没有改变之后,我们执行一些代码块。

2 个答案:

答案 0 :(得分:8)

我只会使用java.util.concurrent.AtomicReference,除非你真的需要完全相等的检查,而不是简单的==

compareAndSet返回一个值,说明该值是否为预期值,因此您可以有条件地执行其他代码。

在同步块中执行抽象方法听起来像是一个有潜在风险的业务 - 没有迹象或约束可能需要多长时间。

这样说:我认为除非我知道特定的要求使用类似你提议的框架的东西,否则我会坚持使用java.util.concurrent.atomic中的类型。

答案 1 :(得分:1)

  

你们认为这是一个很好的原子操作通用框架吗?

是的,它位于java.util.concurrent.atomic包中。

  

如果“if else”有一个单字节代码,那么这个“if else”指令是原子的吗?

不一定 - 一个字节码指令可能会转换为多个机器指令。

注意:您的代码使用的是一个从未在一次调用中释放的synchronized块 - 因此,如果在进入块时条件为false,则可能永远不会成为真。