• JDK原子类操作


    JDK原子类操作及原理

    在JDK5之后,JDK提供了对变量的原子类操作,
    java.util.concurrent.atomic里都是原子类

    原子类的分类

    • 原子更新基本类型
    • 原子更新数组
    • 原子更新抽象类型
    • 原子更新字段

    原子基本类型

    package JavaCore.MultiThread.advanced.AtomicClass;
    
    import java.util.concurrent.atomic.AtomicInteger;
    import java.util.concurrent.atomic.AtomicIntegerArray;
    import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
    import java.util.concurrent.atomic.AtomicReference;
    
    /*******************************************************************************
     * @Copyright (C), 2018-2019,github:Swagger-Ranger 
     * @FileName: ThreadOfSynchronized
     * @Author: liufei32@outlook.com
     * @Date: 2019/3/5 9:56
     * @Description: 不使用synchronized,而使用原子类实现保证线程安全性操作
     * @Aha-eureka:
     *******************************************************************************/
    
    public class ThreadOfSynchronized_Atomic {
    
        //基本类型
        private AtomicInteger value = new AtomicInteger();
    
        //数组
        private int[] ints = {1, 2, 4, 8, 16};
        AtomicIntegerArray atomicIntegerArray = new AtomicIntegerArray(ints);
    
        //抽象类型,抽象类型的字段必须使用volatile来修饰,不然会运行报错
        User user = new User();
        AtomicReference<User> userAtomicReference = new AtomicReference<>();
        //然后使用AtomicIntegerFieldUpdater更新字段
        AtomicIntegerFieldUpdater userUpdate = AtomicIntegerFieldUpdater.newUpdater(User.class, "age");
    
        public int getNextValue() {
            userUpdate.getAndIncrement(user);
            System.out.println(user.age);
            return value.getAndIncrement();
        }
    
        public static void main( String[] args ) {
            ThreadOfSynchronized_Atomic ts = new ThreadOfSynchronized_Atomic();
    
            new Thread(()->{
                while (true) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                    System.out.println(Thread.currentThread().getName() + " " + ts.getNextValue());
                }
    
            },"Swagger").start();
    
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName() + " " + ts.getNextValue());
                    }
                }
            },"Ranger").start();
        }
    }
    
    

    本博客为Swagger-Ranger的笔记分享,文中源码地址: https://github.com/Swagger-Ranger
    欢迎交流指正,如有侵权请联系作者确认删除: liufei32@outlook.com

  • 相关阅读:
    Django各个文件中常见的模块导入
    js模板(template.js)实现页面动态渲染
    Netty 源码 Channel(一)概述
    Netty 源码 NioEventLoop(三)执行流程
    Netty 源码(一)Netty 组件简介
    Netty 源码(二)NioEventLoop 之 Channel 注册
    Java 算法(一)贪心算法
    Netty Reator(三)Reactor 模型
    Netty Reator(二)Scalable IO in Java
    Reactor 模型(一)基本并发编程模型
  • 原文地址:https://www.cnblogs.com/Swagger-Ranger/p/10669909.html
Copyright © 2020-2023  润新知