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);
        }

    }
}
  • 运行结果 ,会发现我们数组线程每次 加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);
    }


}
  • 运行结果
    在这里插入图片描述

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

  • 可见范围
  • 不支持static 修饰的变量 否则会出现异常
相关文章
|
11月前
|
SQL 缓存 安全
JUC第十讲:CAS,Unsafe和原子类详解
JUC第十讲:CAS,Unsafe和原子类详解
JUC第十讲:CAS,Unsafe和原子类详解
|
3月前
|
安全 前端开发 Java
并发编程之原子操作Atomic&Unsafe
并发编程之原子操作Atomic&Unsafe
|
15天前
|
存储 安全 C++
C++ 原子变量atomic variable
原子变量是 C++11 引入的一种同步机制,用于多线程环境中的无锁、线程安全操作。其操作不可分割,避免了数据竞争和不一致问题。原子变量位于 `&lt;atomic&gt;` 头文件中,支持多种类型如 `std::atomic&lt;T&gt;` 和特化类型。基本用法包括定义原子变量、加载、存储、交换及比较交换操作。内存顺序(如 `std::memory_order_seq_cst`)用于控制内存访问顺序和可见性,适用于不同场景。原子变量常用于线程安全的计数器和标志位等。
|
4月前
|
安全 Java vr&ar
Atomic原子类总结
Atomic原子类总结
|
缓存 安全 Java
Java并发编程中的四个关键字:ThreadLocal、Volatile、Synchronized和Atomic
Java并发编程中的四个关键字:ThreadLocal、Volatile、Synchronized和Atomic
248 0
|
安全 Java
【JUC基础】10. Atomic原子类
Atomic英译为原子的。原子结构通常称为不可分割的最小单位。而在JUC中,java.util.concurrent.atomic 包是 Java 并发库中的一个包,提供了原子操作的支持。它包含了一些原子类,用于在多线程环境下进行线程安全的原子操作。使用原子类可以避免使用锁和同步机制,从而减少了线程竞争和死锁的风险,并提高了多线程程序的性能和可伸缩性。
106 0
并发编程(八)Unsafe&Atomic
并发编程(八)Unsafe&Atomic
75 0
|
算法 安全 Java
【小家java】原子操作你还在用Synchronized?Atomic、LongAdder你真有必要了解一下了(上)
【小家java】原子操作你还在用Synchronized?Atomic、LongAdder你真有必要了解一下了(上)
【小家java】原子操作你还在用Synchronized?Atomic、LongAdder你真有必要了解一下了(上)