zoukankan      html  css  js  c++  java
  • 并发之AtomicIntegerFieldUpdater

    基于反射的实用工具,可以对指定类的指定 volatile int 字段进行原子更新。此类用于原子数据结构,该结构中同一节点的几个字段都独立受原子更新控制。
    先来看一段代码:
    package automic;
    import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
    /**
     * 原子整型字段更新操作
     * @author gosaint
     *
     */
    public class AtomicIntegerFieldUpdaterTest {
         private static Class<Person> cls;
         /**
          * AtomicIntegerFieldUpdater说明
          * 基于反射的实用工具,可以对指定类的指定 volatile int 字段进行原子更新。此类用于原子数据结构,
          * 该结构中同一节点的几个字段都独立受原子更新控制。
          * 注意,此类中 compareAndSet 方法的保证弱于其他原子类中该方法的保证。
          * 因为此类不能确保所有使用的字段都适合于原子访问目的,所以对于相同更新器上的 compareAndSet 和 set 的其他调用,
          * 它仅可以保证原子性和可变语义。
          * @param args
          */
         public static void main(String[] args) {
            // 新建AtomicLongFieldUpdater对象,传递参数是“class对象”和“long类型在类中对应的名称”
            AtomicIntegerFieldUpdater<Person> mAtoLong = AtomicIntegerFieldUpdater.newUpdater(Person.class, "id");
            Person person = new Person(12345);
            mAtoLong.compareAndSet(person, 12345, 1000);
            System.out.println("id="+person.getId());
         }
    }
    package automic;
    class Person {
        volatile int id;
        public Person(int id) {
            this.id = id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public int getId() {
            return id;
        }
    }
    1)在上述的例子中,对于字段ID的修改,其中id的修饰必须是基本类型数据,用volatile修饰,不能是包装类型,int,long就可以,但是不可以是Integer和Long;
    2) 必须是实例变量,不可以是类变量;
    3) 必须是可变的变量,不能是final修饰的变量
  • 相关阅读:
    求字符串长度
    n人围圈报数,报3出圈
    设计模式-桥梁模式(11)
    ajax
    数组右移
    数组元素交换
    倒序输出(指针方法)
    myeclipse6.5使用tomcat7报java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory错
    设计模式-组合模式(10)
    刷评论脚本
  • 原文地址:https://www.cnblogs.com/gosaint/p/9064048.html
Copyright © 2011-2022 走看看