美文网首页
<> 更新器AtomicIntegerField

<> 更新器AtomicIntegerField

作者: monk87 | 来源:发表于2019-10-12 17:36 被阅读0次

    这是一个原子的更新器。 能够在多线程情况下 ,吧某个对象的某一个field原子的更新到指定的field。 下面下列出其使用注意事项,然后给出例子。

    • 更新器更新的必须是int类型的变量,不能是包装类型。
    • 更新器更新的必须是volatile类型的变量,确保在多线程更新过程中该变量的可见性。
    • 变量必须是实例变量,不能是static的。因为Unsafe.objectFieldOffset()方法不支持静态变量。(cas操作本质上是通过对象实例的偏移量来直接进行赋值。)
    • 更新器只能更新它可见范围内的变量。因为更新器是通过反射来得到这个变量。如果变量不可见就会报错。

    例子

    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());
         }
    }
    
    

    相关文章

      网友评论

          本文标题:<> 更新器AtomicIntegerField

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