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 修饰的变量 否则会出现异常
相关文章
|
6月前
|
算法 程序员 C语言
C/C++原子操作与atomic CAS底层实现原理
假定有两个操作A 和B,如果从执行A 的线程来看,当另一个线程执行B 时,要么将B 全部执行完,要么完全不执行B,那么A 和B 对彼此来说是原子的。
440 1
C/C++原子操作与atomic CAS底层实现原理
|
SQL 缓存 安全
JUC第十讲:CAS,Unsafe和原子类详解
JUC第十讲:CAS,Unsafe和原子类详解
JUC第十讲:CAS,Unsafe和原子类详解
|
5月前
|
安全 前端开发 Java
并发编程之原子操作Atomic&Unsafe
并发编程之原子操作Atomic&Unsafe
|
2月前
|
存储 安全 C++
C++ 原子变量atomic variable
原子变量是 C++11 引入的一种同步机制,用于多线程环境中的无锁、线程安全操作。其操作不可分割,避免了数据竞争和不一致问题。原子变量位于 `&lt;atomic&gt;` 头文件中,支持多种类型如 `std::atomic&lt;T&gt;` 和特化类型。基本用法包括定义原子变量、加载、存储、交换及比较交换操作。内存顺序(如 `std::memory_order_seq_cst`)用于控制内存访问顺序和可见性,适用于不同场景。原子变量常用于线程安全的计数器和标志位等。
|
3月前
|
安全 Java API
Java多线程编程:使用Atomic类实现原子操作
在Java多线程环境中,共享资源的并发访问可能导致数据不一致。传统的同步机制如`synchronized`关键字或显式锁虽能保障数据一致性,但在高并发场景下可能导致线程阻塞和性能下降。为此,Java提供了`java.util.concurrent.atomic`包下的原子类,利用底层硬件的原子操作确保变量更新的原子性,实现无锁线程安全。
30 0
|
6月前
|
安全 Java vr&ar
Atomic原子类总结
Atomic原子类总结
|
6月前
|
前端开发
原子类的说明与使用
原子类的说明与使用 原子类是一种用于指定元素样式的基础类,它们只有一个属性:display: inline-block;,并且不包含任何内边距(padding)和外边距(margin)。原子类非常适合于构建重复使用的组件和样式。使用原子类可以提高样式的可复用性和可维护性,因为它们是单一的、独立的类,可以方便地组合和重复使用。
|
安全 Java
【JUC基础】10. Atomic原子类
Atomic英译为原子的。原子结构通常称为不可分割的最小单位。而在JUC中,java.util.concurrent.atomic 包是 Java 并发库中的一个包,提供了原子操作的支持。它包含了一些原子类,用于在多线程环境下进行线程安全的原子操作。使用原子类可以避免使用锁和同步机制,从而减少了线程竞争和死锁的风险,并提高了多线程程序的性能和可伸缩性。
120 0