CAS示例代码

public class CASCounter {
    private int i = 0;

    private static Unsafe unsafe;	
    private static long offset;		

    static {
        try {
            var unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
            unsafeField.setAccessible(true);
            unsafe = (Unsafe) unsafeField.get(null);

            Field fc = CASCounter.class.getDeclaredField("i");
            offset = unsafe.objectFieldOffset(fc);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    public void increment() {
        while (true) {
            int currentValue = i;
            int newValue = currentValue + 1;
            if (unsafe.compareAndSwapInt(this, offset, currentValue, newValue)) {
                return;
            }
        }
    }

    public void decrement() {
        while (true) {
            int currentValue = i;
            int newValue = currentValue - 1;
            if (unsafe.compareAndSwapInt(this, offset, currentValue, newValue)) {
                return;
            }
        }
    }

    public int value() {
        return i;
    }
}
posted @ 2024-09-02 11:31  秋水秋色  阅读(1)  评论(0编辑  收藏  举报