返回顶部
首页 > 资讯 > 精选 >Java多线程中原子性操作类怎么用
  • 577
分享到

Java多线程中原子性操作类怎么用

2023-06-25 11:06:12 577人浏览 泡泡鱼
摘要

小编给大家分享一下Java多线程中原子性操作类怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言:在java5以后,我们接触到了线程原子性操作,也就是在修改

小编给大家分享一下Java多线程中原子性操作类怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

前言:

在java5以后,我们接触到了线程原子性操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,本文总结一下Atomic系列的类的使用方法,其中包含:

Java多线程中原子性操作类怎么用

1. 基本类型的使用

public class AtomicTest {        public static void main(String[] args) {        final AtomicTicket ticket = new AtomicTicket();        for (int i = 0; i < 3; i++) {            new Thread(new Runnable() {                @Override                public void run() {                    while (ticket.getCount() > 0) {                        System.out.println(Thread.currentThread().getName() + " count: " + ticket.decrement());                    }                }            }).start();        }    }}class AtomicTicket {    public AtomicInteger count = new AtomicInteger(100);    public int decrement() {        return count.getAndDecrement();    }    public int getCount() {        return count.get();    }}

Thread-0 count: 100
Thread-2 count: 98
Thread-1 count: 99
Thread-2 count: 96
Thread-0 count: 97
Thread-2 count: 94
Thread-2 count: 92
Thread-1 count: 95
中间省略...
Thread-1 count: 12
Thread-2 count: 7
Thread-0 count: 9
Thread-2 count: 5
Thread-1 count: 6
Thread-2 count: 3
Thread-0 count: 4
Thread-2 count: 1
Thread-1 count: 2

2. 数组类型的使用

public class AtomicIntegerArrayTest {        private final static AtomicIntegerArray ATOMIC_INTEGER_ARRAY = new AtomicIntegerArray(new int[]{1,2,3,4,5,6,7,8,9,10});    public static void main(String []args) throws InterruptedException {        Thread []threads = new Thread[10];        for(int i = 0 ; i < 10 ; i++) {            final int index = i;            threads[i] = new Thread() {                public void run() {                    int original =  ATOMIC_INTEGER_ARRAY.get(index);                    int result = ATOMIC_INTEGER_ARRAY.addAndGet(index, index + 1);                    System.out.println("currentThread:" + Thread.currentThread().getName() + " , 原始值为:" + original + ",增加后的结果为:" + result);                }            };            threads[i].start();        }        for(Thread thread : threads) {            thread.join();        }        System.out.println("=========================>\n执行已经完成,结果列表:");        for(int i = 0 ; i < ATOMIC_INTEGER_ARRAY.length() ; i++) {            System.out.println(ATOMIC_INTEGER_ARRAY.get(i));        }    }}

currentThread:Thread-0 , 原始值为:1,增加后的结果为:2
currentThread:Thread-3 , 原始值为:4,增加后的结果为:8
currentThread:Thread-2 , 原始值为:3,增加后的结果为:6
currentThread:Thread-1 , 原始值为:2,增加后的结果为:4
currentThread:Thread-5 , 原始值为:6,增加后的结果为:12
currentThread:Thread-4 , 原始值为:5,增加后的结果为:10
currentThread:Thread-6 , 原始值为:7,增加后的结果为:14
currentThread:Thread-7 , 原始值为:8,增加后的结果为:16
currentThread:Thread-8 , 原始值为:9,增加后的结果为:18
currentThread:Thread-9 , 原始值为:10,增加后的结果为:20
=========================>

执行已经完成,结果列表:
2
4
6
8
10
12
14
16
18
20

3. 引用类型的使用

public class AtomicReferenceTest {    public static void main(String[] args) {        People people1 =new People("Bom", 0);        People people2 =new People("Tom",10);        //先初始化一个值,如果不初始化则默认值为null        AtomicReference<People> reference = new AtomicReference<>(people1);        People people3 = reference.get();        if (people3.equals(people1)) {            System.out.println("people3:" + people3);        } else {            System.out.println("else:" + people3);        }                boolean b = reference.compareAndSet(null, people2);        System.out.println("myClass.main-"+b+"--"+reference.get());        boolean b1 = reference.compareAndSet(people1, people2);        System.out.println("myClass.main-"+b1+"--"+reference.get());        new Thread(new Runnable() {            @Override            public void run() {                System.out.println(Thread.currentThread().getName());                People people = reference.get();                people.setName("Tom"+Thread.currentThread().getName());                people.setAge(people.getAge()+1);                reference.getAndSet(people);                System.out.println(Thread.currentThread().getName()+reference.get().toString());            }        }).start();        new Thread(new Runnable() {            @Override            public void run() {                System.out.println(Thread.currentThread().getName());                People people = reference.get();                people.setName("Tom"+Thread.currentThread().getName());                people.setAge(people.getAge()+4);                reference.getAndSet(people);                System.out.println(Thread.currentThread().getName()+reference.get().toString());            }        }).start();    }} class People {    private String name;    private int age;    public People(String name, int age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return "People{" +                "name='" + name + ''' +                ", age=" + age +                '}';    }}

4.字段类型的使用

public class AtomicIntegerFieldUpdaterTest {        public final static AtomicIntegerFieldUpdater<A> ATOMIC_INTEGER_UPDATER = AtomicIntegerFieldUpdater.newUpdater(A.class, "intValue");    public static void main(String[] args) {        final A a = new A();        for (int i = 0; i < 10; i++) {            new Thread() {                public void run() {                    System.out.println(                            Thread.currentThread().getName() + " " + ATOMIC_INTEGER_UPDATER.get(a));                    ATOMIC_INTEGER_UPDATER.addAndGet(a, 11);                    System.out.println(                            Thread.currentThread().getName() + " " + ATOMIC_INTEGER_UPDATER.get(a));                    if (ATOMIC_INTEGER_UPDATER.compareAndSet(a, ATOMIC_INTEGER_UPDATER.get(a), 120)) {                        System.out.println(Thread.currentThread().getName() + " 对应的值做了修改!");                    }                    System.out.println(                            Thread.currentThread().getName() + " " + ATOMIC_INTEGER_UPDATER.get(a));                }            }.start();        }    }    static class A {        volatile int intValue = 100;    }}

Thread-0 100
Thread-2 100
Thread-1 100
Thread-2 122
Thread-3 111
Thread-5 120
Thread-0 111
Thread-5 142
Thread-3 131
Thread-2 对应的值做了修改!
Thread-2 120
Thread-8 120
Thread-4 133
Thread-1 133
Thread-9 142
Thread-4 142
Thread-4 对应的值做了修改!
Thread-8 131
Thread-3 对应的值做了修改!
Thread-3 120
Thread-7 120
Thread-7 131
Thread-5 对应的值做了修改!
Thread-5 120
Thread-6 120
Thread-0 对应的值做了修改!
Thread-6 131
Thread-7 对应的值做了修改!
Thread-8 对应的值做了修改!
Thread-4 120
Thread-9 131
Thread-1 对应的值做了修改!
Thread-9 对应的值做了修改!
Thread-8 120
Thread-7 120
Thread-6 对应的值做了修改!
Thread-0 131
Thread-6 120
Thread-9 120
Thread-1 120

以上是“Java多线程中原子性操作类怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Java多线程中原子性操作类怎么用

本文链接: https://lsjlt.com/news/304165.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java多线程中原子性操作类怎么用
    小编给大家分享一下Java多线程中原子性操作类怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言:在java5以后,我们接触到了线程原子性操作,也就是在修改...
    99+
    2023-06-25
  • Java多线程 原子性操作类的使用
    目录1. 基本类型的使用2. 数组类型的使用3. 引用类型的使用 4.字段类型的使用前言: 在java5以后,我们接触到了线程原子性操作,也就是在修改时我们只需要保证它的那个瞬间是安...
    99+
    2024-04-02
  • Java多线程 原子操作类详细
    目录1、What and Why2、原子更新基本类型类3、实现原理4、原子更新数组5、原子更新引用类型6、原子更新字段类1、What and Why 原子的本意是不能被分割的粒子,而...
    99+
    2024-04-02
  • Java多线程Atomic包操作原子变量与原子类的示例分析
    这篇文章主要介绍Java多线程Atomic包操作原子变量与原子类的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、何谓Atomic?Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位。计算机中的...
    99+
    2023-05-30
    java
  • Java中怎么实现原子操作类
    这篇文章将为大家详细讲解有关Java中怎么实现原子操作类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 一、引言在 JDK1.5 中新增 java.util.concurrent(...
    99+
    2023-06-19
  • Java 内存模型与原子性:探索多线程编程中的原子操作与内存屏障
    Java 内存模型概述 Java 内存模型(JMM)定义了 Java 虚拟机(JVM)如何处理多线程对共享内存的访问。JMM 规定了线程对共享变量的读写操作必须是原子的,即一个线程对共享变量的修改操作要么全部执行,要么完全不执行,不会出...
    99+
    2024-02-04
    Java 内存模型 原子性 内存屏障 volatile 变量
  • C#多线程系列之原子操作
    目录知识点竞争条件线程同步CPU时间片和上下文切换阻塞内核模式和用户模式Interlocked类1,出现问题2,Interlocked.Increment()3,Interlocke...
    99+
    2024-04-02
  • Java线程安全中的原子性是什么
    本篇内容介绍了“Java线程安全中的原子性是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!何为原子性原子性:一条线程在执行一系列程序指令...
    99+
    2023-07-05
  • Java并发编程之原子操作类详情
    JUC包提供了一系列的原子性操作类,这些类都是使用非阻塞算法CAS实现的,相比使用锁实现原子性操作者在性能上有很大提升。JUC包中含有AtomicInteger、AtomicLong...
    99+
    2024-04-02
  • OpenMP创建线程中的锁及原子操作性能分析
    这篇文章主要讲解了“OpenMP创建线程中的锁及原子操作性能分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“OpenMP创建线程中的锁及原子操作性能分析”...
    99+
    2024-04-02
  • Java自增操作的原子性是什么
    这期内容当中小编将会给大家带来有关Java自增操作的原子性是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。最近在工作中和一个同事因为自增是不是原子性操作争论的面红耳赤,那Java的自增操作到底是不是原...
    99+
    2023-06-17
  • Java线程安全中的原子性浅析
    目录何为原子性解决方法CAS机制(Compare And Swap)何为原子性 原子性:一条线程在执行一系列程序指令操作时,该线程不可中断。一旦出现中断,那么就可能会导致程序执行前后...
    99+
    2023-02-21
    Java线程原子性 Java线程安全原子性
  • JDK8中新增的原子性操作类LongAdder详解
    前言本文主要给大家介绍了关于JDK8新增的原子性操作类LongAdder的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:LongAdder简单介绍LongAdder类似于AtomicLong是原子性递增或者递减类,...
    99+
    2023-05-31
    jdk8 原子性 操作类longadder
  • Java多线程的原子性,可见性,有序性你都了解吗
    目录1.原子性问题2.可见性问题3.有序性问题总结问题: 1.什么是原子性、可见性、有序性? 1. 原子性问题 原子性、可见性、有序性是并发编程所面临的三大问题。 所谓原子操作,就是...
    99+
    2024-04-02
  • java中多线程的作用是什么
    这篇文章将为大家详细讲解有关java中多线程的作用是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、说明多线程是指在一个进程中,并发执行了多个线程,每个线程都实现了不同的功能。2、作用(1)在单核C...
    99+
    2023-06-15
  • Java Thread多线程开发中Object类怎么使用
    这篇“Java Thread多线程开发中Object类怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Jav...
    99+
    2023-07-05
  • 详解Java线程中常用操作
    目录线程的常用操作守护线程(后台线程)线程串行化线程优先级线程中断线程的常用操作 设置线程名字:setName() 获取线程名称:getName() 线程唯一Id:getId() /...
    99+
    2024-04-02
  • VB.NET中怎么操作类属性
    今天就跟大家聊聊有关VB.NET中怎么操作类属性,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。VB.NET类属性的例子:Public Class TestClas...
    99+
    2023-06-17
  • java中多线程的原理是什么
    java中多线程的原理是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据...
    99+
    2023-06-14
  • java 中多线程的原理是什么
    今天就跟大家聊聊有关java 中多线程的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.基本概念程序、进程、线程程序(program)是为完成特定任务、用某种语言编写的一...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作