-1

これは私がこれまでに持っているものです。正しい方向に進んでいますか? あるスレッドが他のスレッドよりも頻繁にシングルトンにアクセスする必要があるシナリオでこれを使用することを目的としているため、ロックのないコードが望ましいため、練習のためにアトミック変数を使用したいと考えました。

public final class ThreadSafeLazyCompareAndSwapSingleton {

private ThreadSafeLazyCompareAndSwapSingleton(){}

private static volatile ThreadSafeLazyCompareAndSwapSingleton instance;
private final static AtomicBoolean atomicBoolean = new AtomicBoolean(false);

public static ThreadSafeLazyCompareAndSwapSingleton getCASInstance(){
    if (instance==null){
        boolean obs = instance==null;
        while (!atomicBoolean.compareAndSet(true, obs == (instance==null))){
            instance = new ThreadSafeLazyCompareAndSwapSingleton(); 
        }
    }
    return instance;
}

}
4

3 に答える 3

0

ええと、これらのインライン条件/代入では読みにくいです。かなり非標準的なイディオムでもあるので、本当に使いたいのだろうか。

少なくとも、複数のインスタンスを作成できるという問題があります(あなたの場合は許容できるかもしれませんが、ロックフリーにしたい場合はそれを避けることはできません)。しかし、それは複数のインスタンスを返す可能性もあると思いますが、これはあなたが望むものではないと思います。

ブール値が必要かどうかはわかりませんinstance。フィールドで直接 AtomicReferenceFieldUpdater を使用することもできます。

obs は必要ないと思います。ブール値を設定できる場合は新しいインスタンスを作成して返し、それ以外の場合はループします。

if (instance!=null)
  return instance;

if (atomicBoolean.compareAndSet(false, true))
{
  instance = new ThreadSafeLazyCompareAndSwapSingleton();
  return instance;
}
while(instance==null);
return instance;

しかし、この余分なブール値を使用するのは良い考えだとは本当に思いません。

于 2014-06-26T18:51:47.123 に答える