zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Case用法
    SQL 常用函数及示例
    ms-SQL 递归调用
    office2003 下载地址 及密码
    [LeetCode] 697. Degree of an Array 数组的度
    [LeetCode] 58. Length of Last Word 求末尾单词的长度
    [LeetCode] 288.Unique Word Abbreviation 独特的单词缩写
    [LeetCode] 287. Find the Duplicate Number 寻找重复数
    [LeetCode] 350. Intersection of Two Arrays II 两个数组相交II
    [LeetCode] 349. Intersection of Two Arrays 两个数组相交
  • 原文地址:https://www.cnblogs.com/Swagger-Ranger/p/10669909.html
Copyright © 2011-2022 走看看