Atomic原子类-2

简介: Atomic原子类-2

@[toc]

  • 上文我们介绍了Atomic原子类 并且写了 AtomicInteeger 的使用 简单的介绍了底层的实现 CAS
  • 本章我们介绍下 AtmoicArray 与 AtmoicReference

在这里插入图片描述

Atomic*Array 数组原子类

package com.yxl.modules.controller;

import java.util.concurrent.atomic.AtomicIntegerArray;

/**
 * 演示AtomicIntegerArray
 */
public class AtmoicArray {
    public static void main(String[] args) throws InterruptedException {
      AtomicIntegerArray atomicIntegerArray=new AtomicIntegerArray(1000);

        Decrement decrement = new Decrement(atomicIntegerArray);
        Increment increment = new Increment(atomicIntegerArray);


        Thread[] threads= new Thread[100];
        Thread[] threads2= new Thread[100];

        for (int i = 0; i < 100 ; i++) {
            threads2[i]=new Thread(decrement);
            threads[i]=new Thread(increment);
            threads2[i].start();
            threads[i].start();
        }

        for (int i = 0; i < 100 ; i++) {
            threads2[i].join();
            threads[i].join();
        }

        for (int i = 0; i <  atomicIntegerArray.length(); i++) {
            if(atomicIntegerArray.get(i)!=0) {
                System.out.println("发现非0值" + i);
            }
        }
        System.out.println("运行结束");

    }


}

class  Decrement implements Runnable{
    private  AtomicIntegerArray array;

    Decrement(AtomicIntegerArray array) {
        this.array = array;
    }

    @Override
    public void run() {
        for (int i = 0; i < array.length() ; i++) {
            array.getAndDecrement(i);
        }

    }
}

class  Increment implements Runnable{
    private  AtomicIntegerArray array;

    Increment(AtomicIntegerArray array) {
        this.array = array;
    }

    @Override
    public void run() {
        for (int i = 0; i < array.length() ; i++) {
            array.getAndIncrement(i);
        }

    }
}
AI 代码解读
  • 运行结果 ,会发现我们数组线程每次 加100 减100 ,并不会出现不等于0的数据,数据并没有出现错乱,AtomicIntegerArray 给我们提供了数组的原子性
    在这里插入图片描述

Atomic*Reference 引用类型原子类

Atomic*Reference 和我们之前讲过的 AtomicInether 本质没有任何区别,
AtomicInether 可以让一个整形保证原子性
而AtomicReference可以让对象保证原子性,
AtomicReference的用法肯定要比AtomicInether强,因为它一个对象可以包含多个属性

在这里插入图片描述

  • 因为他是对象比较比较,所有不会有自增,自减操作,他会进行对象比较
    我们看下jdk 方法

在这里插入图片描述

把普通变量升级为原子变量

AtomicIntergerfiledUpdateer 对普通变量进行升级

  • 代码示例
package com.yxzapp.aspect;

import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;

public class a implements  Runnable{

    static Persion persion;

    static Persion tom;

    //AtomicIntegerFieldUpdater的用法
    AtomicIntegerFieldUpdater<Persion > atomicIntegerFieldUpdater = AtomicIntegerFieldUpdater.newUpdater(Persion.class,"store");

    @Override
    public void run() {

        for (int i = 0; i < 10000 ; i++) {
            persion.store++;
            atomicIntegerFieldUpdater.getAndIncrement(tom);
        }

    }

    public static  class Persion{
            volatile int store;
        }


    public static void main(String[] args) throws InterruptedException {
        persion=new Persion();
        tom = new Persion();
        a a = new a();
        Thread thread = new Thread(a);
        Thread thread2 = new Thread(a);
        thread.start();
        thread2.start();
        thread.join();
        thread2.join();
        System.out.println("tom" + tom.store);
        System.out.println("persion " + persion.store);
    }


}
AI 代码解读
  • 运行结果
    在这里插入图片描述

但是使用AtomicIntergerfiledUpdateer 有几点需要注意

  • 可见范围
  • 不支持static 修饰的变量 否则会出现异常
目录
打赏
0
0
0
0
2
分享
相关文章
前端js实现从视频中提取图片帧
前端js实现从视频中提取图片帧
283 0
知识分享之Golang——一个常见word、excel转换pdf的工具函数
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。 知识分享系列目前包含Java、Golang、Linux、Docker等等。
907 0
知识分享之Golang——一个常见word、excel转换pdf的工具函数
什么是队列,如何实现?
什么是队列,如何实现?
146 0
什么是队列,如何实现?
医院智慧服务如何以安全的方式进行对互联网开放?
医院智慧服务重点强调,以应用信息技术手段改善患者就医体验,加强患者信息互联共享,提升医疗服务智慧化水平的同时要安全保护,以安全的方式进行对互联网开放,做到数据的发布、订阅、回收、分析等可追溯管理。
681 0
医院智慧服务如何以安全的方式进行对互联网开放?
win10 uwp 萤火虫效果
原文:win10 uwp 萤火虫效果 本文在Nukepayload2指导下,使用他的思想用C#写出来。 本文告诉大家,如何使用 win2d 做出萤火虫效果。
1612 0
用Visual Studio 2010编写Data Url生成工具C#版
声明:本文系本人依照真实经历原创,未经许可,谢绝转载。 此文百度经验版本:如何用Visual Studio 2010打造Data Url生成工具 源码下载:用Visual Studio 2010编写Data Url生成工具C#源码 什么是Data Url呢?Data URI scheme是在RFC2397中定义的,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入。
910 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问