美文网首页
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