1

これはアトミック操作の優れた汎用フレームワークだと思いますか? また、単一の JVM で一度に複数のバイトコードを実行する方法がないため、Java アプリケーションに関して個々のバイトコードはアトミックであると言うのは正しいと思いますか? では、if else に 1 バイト コードがあれば、この 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();

これは実際には比較実行フレームワークであるため、元のスナップされた値が変更されていないことを確認した後、コードのブロックを実行します。

4

2 に答える 2

8

java.util.concurrent.AtomicReference単純な. _ _==

compareAndSet値が期待値であったかどうかを示す値を返すため、条件付きで他のコードを実行できます。

同期されたブロックで抽象メソッドを実行することは、潜在的に危険なビジネスのように思えます-それがどれくらいかかるかについての指示や制約はありません.

このように言えば、提案されたフレームワークのようなものを使用するための特定の要件を知っていない限り、 の型に固執すると思いますjava.util.concurrent.atomic

于 2013-02-08T11:08:21.910 に答える
1

これはアトミック操作の優れた汎用フレームワークだと思いますか?

はい、java.util.concurrent.atomicパッケージにあります。

「if else」のシングルバイトコードがあった場合、この「if else」命令はアトミックになりますか?

必ずしもそうではありません - 1 つのバイトコード命令が複数のマシン命令に変換される場合があります。

注: あなたのコードは、1 回の呼び出しで決して解放されない同期ブロックを使用しています。そのため、ブロックに入ったときに条件が false の場合、決して true にならない可能性があります。

于 2013-02-08T11:10:17.020 に答える