java并发JUC工具包AtomicInteger原子整型语法基础

Java并发JUC工具包提供了一些高效且线程安全的队列、锁和原子变量等工具类,其中AtomicInteger是实现原子性操作整型数据的类。

AtomicInteger类

AtomicInteger类是java.util.concurrent包中的一个类,它提供了一种原子性的更新机制,即多线程环境下对共享的整型变量进行原子性操作,避免了线程安全问题。常用的原子操作方法有getAndAdd()getAndIncrement()getAndDecrement()compareAndSet()等,它们都是线程安全的方法,并且具有原子性。

AtomicInteger类的常用方法

  • public int get():获取当前的值
  • public int getAndSet(int newValue):获取原来的值并设置新值
  • public int getAndIncrement():获取原来的值并自增
  • public int getAndAdd(int delta):获取原来的值并加上指定的值
  • public boolean compareAndSet(int expect, int update):比较并设置新值

示例说明

示例一:多线程自增

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerDemo {

    private static AtomicInteger count = new AtomicInteger(0);

    public static void main(String[] args) throws InterruptedException {
        Runnable runnable = () -> {
            for (int i = 0; i < 10000; i++) {
                count.incrementAndGet();
            }
        };

        Thread t1 = new Thread(runnable);
        Thread t2 = new Thread(runnable);

        t1.start();
        t2.start();

        t1.join();
        t2.join();

        System.out.println("count=" + count.get());
    }
}

在这个示例中,我们使用了AtomicInteger类实现多线程高效自增。

首先,我们创建了一个AtomicInteger类型的静态变量count,并且初始化为0。接着,我们创建了两个线程t1t2,它们共同工作以将count自增10000次。运行结果表明,即使存在多个线程共同访问count变量,由于对它进行自增操作时使用的是原子性方法,因此不会有线程安全问题。

示例二:比较并且设置

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerDemo {

    public static void main(String[] args) throws InterruptedException {
        AtomicInteger atomicInteger = new AtomicInteger(1);
        System.out.println("当前值:" + atomicInteger.get());

        boolean result1 = atomicInteger.compareAndSet(1, 2);
        boolean result2 = atomicInteger.compareAndSet(1, 3);
        System.out.println("操作结果1:" + result1);
        System.out.println("操作结果2:" + result2);

        System.out.println("操作后的值:" + atomicInteger.get());
    }
}

在这个示例中,我们通过compareAndSet()方法来比较并更新AtomicInteger实例。

首先,我们创建一个初始值为1的AtomicInteger实例。接着,我们调用了compareAndSet()方法,并传递了两个参数:期望值和新值。由于当前AtomicInteger的值为1,所以第一个调用会成功,第二个调用会返回false。

通过了解compareAndSet()方法,我们可以发现它实际上执行了两个步骤:首先比较当前的值是否等于期望值,如果相等,则使用新值替换当前值;否则,不进行任何操作,直接返回false。

最后,我们输出更新后的值,即2。该示例说明AtomicInteger类提供的compareAndSet()方法具有原子性,能够在多线程环境中执行可靠的操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java并发JUC工具包AtomicInteger原子整型语法基础 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 利用js获取下拉框中所选的值

    获取下拉框中所选的值是很常见的前端开发需求。可以使用Javascript来轻松实现这一功能。下面提供几种获取下拉框值的方法供大家参考。 通过select元素的selectedIndex属性获取值 select元素有一个selectedIndex属性,可以返回当前选中项在集合中的索引位置。 示例1: <select id="mySelect&q…

    Java 2023年6月15日
    00
  • Java的Hibernate框架中用于操作数据库的HQL语句讲解

    关于Java的Hibernate框架中用于操作数据库的HQL语句,我可以提供以下详细攻略。 什么是HQL HQL(Hibernate Query Language)是Hibernate框架中用来操作数据库的面向对象的语言。它类似于SQL,但是使用OOP的方法来表述查询,完全面向对象。 HQL语句的结构 HQL语句的结构与SQL类似,由SELECT、FROM、…

    Java 2023年5月20日
    00
  • Java系统运行缓慢等问题的排查思路

    我来详细讲解一下“Java系统运行缓慢等问题的排查思路”的完整攻略。 1. 问题定位 首先,我们需要明确具体的问题现象。如果Java系统运行缓慢,可能会有以下一些表现形式: 请求响应时间过长 CPU占用率较高 内存使用率较高 日志输出异常 根据问题现象,我们可以使用以下一些工具来定位问题: 配置管理工具:例如Ansible、Puppet,可以帮助我们收集系统…

    Java 2023年5月24日
    00
  • 利用Java实现mTLS调用

    我来为您详细讲解“利用Java实现mTLS调用”的完整攻略。本攻略分为以下几个部分: 什么是mTLS? mTLS调用需要什么条件? 利用Java实现mTLS调用的步骤 示例说明 1. 什么是mTLS? mTLS是mutual TLS的缩写,指的是双向认证的TLS(Transport Layer Security)协议。mTLS协议允许客户端和服务器之间进行双…

    Java 2023年5月19日
    00
  • Java MyBatis之Mapper代理详解

    Java MyBatis之Mapper代理详解 在MyBatis中,Mapper代理是一种方便且易于使用的方式来执行数据库操作。Mapper代理充当了DAO层与MyBatis框架之间的接口,从而将SQL语句执行的逻辑与业务逻辑分开。 1. Mapper代理的创建 Mapper代理是通过MyBatis框架自动生成的。MyBatis通过读取我们配置的Mapper…

    Java 2023年5月20日
    00
  • 详解如何把cmd黑窗口把java文件打包成jar

    下面我为你详细讲解如何把cmd黑窗口把java文件打包成jar: 什么是Jar文件 Java ARchive文件是Java平台独立的软件包格式,它包含Java Class文件、META-INF目录等资源,可以方便地被Java虚拟机(JVM)和相关的开发工具所识别。 如何将Java文件打包成Jar 第一步:编写Java代码 首先,你需要编写Java代码,并确保…

    Java 2023年5月26日
    00
  • Flink入门级应用域名处理示例

    下面我将详细讲解如何使用Flink来编写一个入门级的域名处理示例。 1. 编写代码 首先,我们需要编写一个Java程序来实现域名处理的示例。代码如下: import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.java.tuple.Tup…

    Java 2023年5月20日
    00
  • Java中Date类和Calendar类的常用实例小结

    我来为你详细讲解 Java 中 Date 类和 Calendar 类的常用实例小结。 一、Date类的常用实例 1. 获取当前的日期和时间 使用 java.util.Date 类提供的无参构造方法可以获取当前的日期和时间。例如: Date date = new Date(); // 获取当前的日期和时间 2. 格式化日期 使用 SimpleDateForma…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部