首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么AtomicLong和AtomicLongFieldUpdater实现compareAndSet的方式不同?

为什么AtomicLong和AtomicLongFieldUpdater实现compareAndSet的方式不同?
EN

Stack Overflow用户
提问于 2019-12-06 16:17:02
回答 1查看 149关注 0票数 1

来自AtomicLong的源代码

代码语言:javascript
复制
    public final boolean compareAndSet(long expect, long update) {
        return unsafe.compareAndSwapLong(this, valueOffset, expect, update);
    }

来自AtomicLongFieldUpdater的源代码

代码语言:javascript
复制
    public static <U> AtomicLongFieldUpdater<U> newUpdater(Class<U> tclass,
                                                           String fieldName) {
        Class<?> caller = Reflection.getCallerClass();
        if (AtomicLong.VM_SUPPORTS_LONG_CAS)
            return new CASUpdater<U>(tclass, fieldName, caller);
        else
            return new LockedUpdater<U>(tclass, fieldName, caller);
    }

    // CASUpdater extends AtomicLongFieldUpdater
        public final boolean compareAndSet(T obj, long expect, long update) {
            accessCheck(obj);
            return U.compareAndSwapLong(obj, offset, expect, update);
        }

    // LockedUpdater extends AtomicLongFieldUpdater
        public final boolean compareAndSet(T obj, long expect, long update) {
            accessCheck(obj);
            synchronized (this) {
                long v = U.getLong(obj, offset);
                if (v != expect)
                    return false;
                U.putLong(obj, offset, update);
                return true;
            }
        }

我的问题是,为什么这两个类使用不同的方法来更新长值?也就是说,为什么AtomicLongFieldUpdater有条件地退回到锁定方法,而AtomicLong不呢?

EN

回答 1

Stack Overflow用户

发布于 2019-12-07 20:44:51

这两个类基本上服务于相同的目的,它们都使用内部Unsafe类来执行“硬的低级”工作。因此,唯一合乎逻辑的是质疑实现的差异。

我猜在AtomicLongFieldUpdater中所做的回退可能只是一个遗物。VM_SUPPORTS_LONG_CASAtomicLong中定义,但仅在AtomicLongFieldUpdater中使用,这一事实可以支持这一点。

另一种可能性是,Java作者决定在一定程度上优化性能,但他们只是在AtomicLongFieldUpdater中做到了这一点。

答案可能隐藏在VM_SUPPORTS_LONG_CAS的javadoc中。

代码语言:javascript
复制
    /**
     * Records whether the underlying JVM supports lockless
     * compareAndSwap for longs. While the Unsafe.compareAndSwapLong
     * method works in either case, some constructions should be
     * handled at Java level to avoid locking user-visible locks.
     */
    static final boolean VM_SUPPORTS_LONG_CAS = VMSupportsCS8();

我担心我们将不得不直接询问作者,以了解确切的推理和含义。似乎在Java5中已经有了几乎相同的代码-参见2007年OpenJDK的“初始加载”提交中的source code。我认为在这个之前很难提交...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59209313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档