CASによるスピンロック

2105 ワード

スピンロックとは
スピンロックは非常に一般的なロック構造であり、スピンロックはリソースを申請しても申請できない場合には保留されず、継続的な申請を選択します.このロック結果は、各スレッドに時間がかかるロックに適用され、スレッドブロック状態切替のコストが待機のコストよりはるかに高い場合に使用される.
CAS操作
CASオペレーションの下位層はアセンブリ言語実装を与え,原子オペレーションである.JavaはCAS操作に対しても上位層のパッケージングを実現している.CAS操作により、基本データ型と参照型に値を付けることができます.
Java実装
import java.util.concurrent.atomic.AtomicReference;

class Scratch {
    public static void main(String[] args) {
        Thing thing1 = new Thing();
        Thing thing2 = new Thing();
        thing1.start();
        thing2.start();
    }

    static class Thing extends Thread {
        private AtomicReference atomicReference = new AtomicReference<>();

        private void lock() {
            while (atomicReference.compareAndSet(null, currentThread())) ;
        }

        private void unlock() {
            atomicReference.compareAndSet(currentThread(), null);
        }

        @Override
        public void run() {
            lock();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread());
            unlock();
        }
    }
}