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

    java并发AtomicIntegerFieldUpdater

    支持对象的成员变量原子操作类由AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,
    AtomicReferenceFieldUpdater。

    AtomicIntegerFieldUpdater的使用特点

    它的API我还无法细致的掌握,它的使用有三点注意事项:
    1.成员变量不能是私有的
    2.int类型必须是volatile
    3.它的实现是基于反射
    以前有同事说过能不用反射就不要反射,很危险。我在写下面例子的时候,没有保证上面的两点,结果写的没有报错,
    但在运行时候就报错了,我们应该知道编译期的错误IDE都能检查出来,可见反射用得不好,只有运行才能发现。
    我认为它的实现之所以是基于反射就是因为成员变量的使用恰恰实在运行期。
    下面的例子就是这样的一个示范。

    简单例子

    package javalearn.javabase.thread.atomic;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.ToString;
    import lombok.extern.slf4j.Slf4j;
    
    import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
    import java.util.concurrent.atomic.AtomicLongFieldUpdater;
    import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
    @Slf4j
    public class AtomicLongfiledupdaterTest {
        public static void main(String[] args) {
            //AtomicLongFieldUpdater atomicLongFieldUpdater;
            //AtomicReferenceFieldUpdater atomicReferenceFieldUpdater;
            AtomicIntegerFieldUpdater atomicIntegerFieldUpdater =AtomicIntegerFieldUpdater.newUpdater(Persion.class
                    ,"id");
            Persion p1 =new Persion("jack",1);
            log.info("persion p1 is {}",p1.toString());
            atomicIntegerFieldUpdater.getAndIncrement(p1);
            log.info("persion p1 is {}",p1.toString());
    
        }
        @AllArgsConstructor
        @Data
        @ToString
        static class Persion {
            protected String name;
            protected volatile int id;
    
        }
    }
    
    

    例子结果

    22:50:00.418 [main] INFO javalearn.javabase.thread.atomic.AtomicLongfiledupdaterTest - persion p1 is AtomicLongfiledupdaterTest.Persion(name=jack, id=1)
    22:50:00.425 [main] INFO javalearn.javabase.thread.atomic.AtomicLongfiledupdaterTest - persion p1 is AtomicLongfiledupdaterTest.Persion(name=jack, id=2)
    
    Process finished with exit code 0
    
  • 相关阅读:
    Qt 4.x调试器问题,缺失调试助手。
    Qt 如何判断文件是不是一个目录
    Qt 5.7设置调试器
    Qt 无法解析外部文件2001,2019之类的
    TCP/UDP socket
    Qt 5.7 版本+2013VS环境配置
    骑行、318总结心得啊经验什么的
    蓝牙硬件交互数据传输Demo
    iOS蓝牙开发总结-4
    iOS蓝牙传输数据演示-3
  • 原文地址:https://www.cnblogs.com/JuncaiF/p/11300409.html
Copyright © 2011-2022 走看看