JAVA语言中的12个原子操作类实例讲解
小标 2019-01-09 来源 : 阅读 1011 评论 0

摘要:本文主要向大家介绍了JAVA语言中的12个原子操作类实例讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言中的12个原子操作类实例讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

1.简介


JDK1.5开始提供了java.util.concurrent.atomic包,这个包中的原子类提供了一种用法简单、性能高效、线程安全的更新变量的方式。 包中共计12个类,分属于4种类型:


原子更新基本类型 原子更新数组 原子更新引用类型 原子更新属性(类的字段) 实现方式


基本都是使用Unsafe实现的包装类。


2.原子更新基本类型


AtomicBoolean:原子更新布尔类型。 AtomicInteger:原子更新整型。 AtomicLong:原子更新长整型。


3.原子更新数组


AtomicIntegerArray:原子更新整型数组里的元素。 AtomicLongArray:原子更新长整型数组里面的元素。 AtomicReferenceArray:原子更新引用类型数组里的元素。


4.原子更新引用类型


AtomicReference:原子更新引用类型。 AtomicReferenceFieldUpdater:原子更新引用类型里的字段。 AtomicMarkableReference:原子更新带有标记位的引用类型。 可以原子更新一个布尔类型的标记位和引用类型。构造方法是:AtomicMarkableReference (V initialRef,boolean initialMark) 。


5.原子更新字段


AtomicIntegerFieldUpdater:原子更新整型字段的更新器。 AtomicLongFieldUpdater:原子更新长整型字段的更新器。 AtomicStampedReference:原子更新带有版本号的引用类型。该类将整数值与引用关联起来,可用于原子的更新数据和数据的版本号,可以解决使用CAS进行原子更新时可能出现的ABA问题。 说明:原子更新字段类需要两步:


创建更新器。因为原子字段更新类都是抽象类,每次使用的时候必须使用静态方法newUpdater()方法创建一个更新器,并且设置想要更新的类和属性。 更新类的字段(属性)必须使用public volatile修饰符。


6.代码测试


    import java.util.concurrent.atomic.AtomicInteger;

    import java.util.concurrent.atomic.AtomicIntegerArray;

    import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;

    import java.util.concurrent.atomic.AtomicReference;

 

    public class Main {

        public static void main(String[] args){

            //原子更新基本类型

            System.out.println("-----原子更新基本类型----");

            AtomicInteger ai=new AtomicInteger(1);

            System.out.println(ai.getAndAdd(1));

            System.out.println(ai.get());

 

            //原子更新数组

            System.out.println("-----原子更新数组----");

            int[] a={1,2,3};

            AtomicIntegerArray array=new AtomicIntegerArray(a);

            array.getAndSet(0,6);

            System.out.println(array.get(0));

 

            System.out.println(a[0]);

 

            //原子更新引用

            System.out.println("-----原子更新引用----");

            AtomicReference<user> are=new AtomicReference<>();

            User user1=new User("cxh",22);

            are.set(user1);

            User user2=new User("caoxiaohong",24);

            are.compareAndSet(user1,user2);

            System.out.println(are.get().getName());

            System.out.println(are.get().getAge());

 

            //原子更新字段

            System.out.println("-----原子更新字段----");

            AtomicIntegerFieldUpdater<profile> aifu=AtomicIntegerFieldUpdater.newUpdater(Profile.class,"age");//创建更新器

            Profile pro=new Profile("Cxh",25);

            System.out.println(aifu.getAndIncrement(pro));

            System.out.println(aifu.get(pro));

 

        }

        //此类用于原子更新引用

        static   class  User{

            String name;

            int age;

            User(String name,int age){

                this.name=name;

                this.age=age;

            }

 

            public int getAge() {

                return age;

            }

 

            public void setAge(int age) {

                this.age = age;

            }

 

            public String getName() {

                return name;

            }

 

            public void setName(String name) {

                this.name = name;

            }

        }

 

        //此类用于原子更新类字段

        static class Profile{

            String name;

            public volatile int age;//类型必须是public volatile 类型

            Profile(String name,int age){

                this.name=name;

                this.age=age;

            }

 

            public int getAge() {

                return age;

            }

 

            public void setAge(int age) {

                this.age = age;

            }

 

            public String getName() {

                return name;

            }

 

            public void setName(String name) {

                this.name = name;

            }

        }

    }

</profile></user>

   

输出结果:


-----原子更新基本类型----

1

2

-----原子更新数组----

6

1

-----原子更新引用----

caoxiaohong

24

-----原子更新字段----

25

26

 

Process finished with exit code 0

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程