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 @   秋水秋色  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示