美文网首页
AtomicIntegerFieldUpdater类的实现

AtomicIntegerFieldUpdater类的实现

作者: plan454 | 来源:发表于2017-02-16 22:57 被阅读0次

介绍:

这个类是基于反射的一个工具类,用于对一个类的 volatile int 的值进行一个原子修改。

详解:

其实这个类的实现和其他的Atomic类的实现差不多,都是一个cas 的原理,只不过在这基础上用了反射来控制对象的字段。

这个类通过一个抽象类,内部有个实现类,通过

  @CallerSensitive
    public static <U> AtomicIntegerFieldUpdater<U> newUpdater(Class<U> tclass,
                                                              String fieldName) {
        return new AtomicIntegerFieldUpdaterImpl<U>
            (tclass, fieldName, Reflection.getCallerClass());
    }

来构造实现类,而实现类也不复杂,主要做了一些鉴权的工作


  AtomicIntegerFieldUpdaterImpl(final Class<T> tclass,
                                      final String fieldName,
                                      final Class<?> caller) {
            final Field field;
            final int modifiers;
            try {
                //将这个方法作标示为特权方法
                field = AccessController.doPrivileged(
                    new PrivilegedExceptionAction<Field>() {
                        public Field run() throws NoSuchFieldException {
                            return tclass.getDeclaredField(fieldName);
                        }
                    });
                //获取修饰符
                modifiers = field.getModifiers();
                //判断调用类对对象类在 modifiers修饰符下有权限调用
                sun.reflect.misc.ReflectUtil.ensureMemberAccess(
                    caller, tclass, null, modifiers);
                ClassLoader cl = tclass.getClassLoader();
                ClassLoader ccl = caller.getClassLoader();
                if ((ccl != null) && (ccl != cl) &&
                    ((cl == null) || !isAncestor(cl, ccl))) {
                   //如果调用方不是被调用方的祖先的话,检查包访问权限
                  sun.reflect.misc.ReflectUtil.checkPackageAccess(tclass);
                }
            } catch (PrivilegedActionException pae) {
                throw new RuntimeException(pae.getException());
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            }

            Class<?> fieldt = field.getType();
            //判断是否是int
            if (fieldt != int.class)
                throw new IllegalArgumentException("Must be integer type");
           //判断是否为volatile
            if (!Modifier.isVolatile(modifiers))
                throw new IllegalArgumentException("Must be volatile type");
            //这步是为了之后的权限校验,如果不为null 之后调用会校验包权限
            this.cclass = (Modifier.isProtected(modifiers) &&
                           caller != tclass) ? caller : null;
            this.tclass = tclass;
          //获取偏移量
            offset = unsafe.objectFieldOffset(field);
        }

其他的部分实现和普通的Atomic类差不多,看这个把java权限部分知识补了一下。

参考资料 :

https://www.ibm.com/developerworks/cn/java/j-lo-rtsecurity/index.html
http://tool.oschina.net/apidocs/apidoc?api=jdk-zh

相关文章

网友评论

      本文标题:AtomicIntegerFieldUpdater类的实现

      本文链接:https://www.haomeiwen.com/subject/gjrcwttx.html