Java多线程与并发_原子操作类

Java多线程与并发_原子操作类

二十多岁的年纪,是一个夹杂着为生活奔忙,疲惫,痛苦和快乐,抑郁,容易想太多,焦虑自己人生能不能成功、混出头的年龄段。
要相信明天会更好!

一、简介

Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。
在Atomic包里一共提供了4种类型的原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新属性(字段)。

二、原子更新基本类型类

AtomicBoolean:原子更新布尔类型,源码实现:先把Boolean转换成整型,再使用compareAndSwapInt进行CAS
AtomicInteger:原子更新整型
AtomicLong:原子更新长整型
//1.原子更新基本类型类
    static AtomicInteger atomic1 = new AtomicInteger(1);
    public static void atomicInteger() {
        //以原子方式将当前值加1,这里返回的是自增前的值
        System.out.println(atomic1.getAndIncrement());
        System.out.println(atomic1.get());
    }

结果

1
2

Process finished with exit code 0

三、原子更新数组

AtomicIntegerArray:原子更新整型数组里的元素
AtomicLongArray:原子更新长整型数组里的元素
AtomicReferenceArray:原子更新引用类型数组里的元素
    //2.原子更新数组
    static int[] value = new int[] {1, 2};
    static AtomicIntegerArray atomic2 = new AtomicIntegerArray(value);//拷贝一份当前数组
    public static void atomicIntegerArray() {
        atomic2.getAndSet(0,3);//修改拷贝的数组索引值为0的元素
        System.out.println(atomic2.get(0));
        System.out.println(value[0]);
    }

结果

3
1

Process finished with exit code 0

四、原子更新引用类型

AtomicReference:原子更新引用类型
AtomicReferenceFiledUpdater:原子更新引用类型里的字段
AtomicMarkableReference:原子更新带有标记位的引用类型
    //3.原子更新引用类型
    static AtomicReference<User> atomicUserRef = new AtomicReference<User>();
    public static void atomicReference() {
        User user = new User("shuPush",18);
        atomicUserRef.set(user);
        User updateUser = new User("slx", 25);
        //compareAndSet方法原理与atomicInteger里的一样,与期望值相同,则修改
        atomicUserRef.compareAndSet(user, updateUser);
        System.out.println(atomicUserRef.get().getName());
        System.out.println(atomicUserRef.get().getOld());
    }

    public static class User {
        private String name;
        private int old;

        public User(String name, int old) {
            this.name = name;
            this.old = old;
        }

        public String getName() {
            return name;
        }

        public int getOld() {
            return old;
        }
    }

结果

slx
25

Process finished with exit code 0

五、原子更新字段类

AtomicIntegerFieldUpdater:原子更新整型的字段的更新器
AtomicLongFieldUpdater:原子更新长整型字段的更新器
AtomicStampedReference:原子更新带有版本号的引用类型
    //创建原子更新器,并设置需要更新的对象类和对象的属性
    private static AtomicIntegerFieldUpdater<User> atomic4 = AtomicIntegerFieldUpdater.newUpdater(User.class,"old");

    public static void main(String[] args) {
        User user = new User("shuPush", 18);
        //shuPush长了一岁,但是仍然会输出旧的年龄
        System.out.println(atomic4.getAndIncrement(user));
        //输出shuPush现在的年龄
        System.out.println(atomic4.get(user));
    }

    public static class User {
        private String name;
        public volatile int old;

        public User(String name, int old) {
            this.name = name;
            this.old = old;
        }

        public String getName() {
            return name;
        }

        public int getOld() {
            return old;
        }
    }

结果

18
19

Process finished with exit code 0
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值