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

yizhihongxing

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日

相关文章

  • jenkins安装及其配置笔记

    下面是详细讲解“Jenkins安装及其配置笔记”的完整攻略。 1. 安装Jenkins 1.1 环境准备 要安装Jenkins,首先需要确保满足以下环境要求: 安装了Java JDK 8或更高版本; 至少有1GB的可用内存; 至少有1GB的可用磁盘空间。 1.2 下载Jenkins 官网下载地址:https://jenkins.io/download/ 推荐…

    Java 2023年5月19日
    00
  • Java集合之Map接口的实现类精解

    Java集合之Map接口的实现类精解 Map是Java集合框架中的一个接口,它提供了一种将键值映射到值的集合,每个键最多只能映射到一个值。常见的实现类有HashMap、TreeMap、LinkedHashMap等。在本篇文章中,我们将详细讲解Map接口及其实现类的特点、使用方法和示例。 Map接口特点 Map接口是用于存储“键-值”对的集合,其中的键和值都是…

    Java 2023年5月19日
    00
  • 利用SpringMVC和Ajax实现文件上传功能

    利用SpringMVC和Ajax实现文件上传功能 在 Web 应用程序中,文件上传功能是非常常见的需求。本文将详细讲解如何利用 SpringMVC 和 Ajax 实现文件上传功能,包括如何配置 SpringMVC、如何编写前端代码、如何编写后端代码等,并提供两个示例说明。 配置 SpringMVC 在 SpringMVC 中,我们需要配置 Multipart…

    Java 2023年5月18日
    00
  • java 实现 stack详解及实例代码

    Java 实现 Stack 详解及实例代码 什么是 Stack Stack(堆栈)是一种存储数据的结构,其遵循后进先出(LIFO)的原则。在 Stack 中,只有在栈顶的元素才能被访问、删除或更新,而其他的元素则需要等待栈顶元素先被操作。 Stack 的基本操作 Stack 可以执行以下操作: push:将数据项压入 stack 的顶部。 pop:弹出 st…

    Java 2023年5月26日
    00
  • 用JavaScript和注册表脚本实现右键收藏Web页选中文本

    为了实现右键收藏Web页选中文本的功能,我们需要使用JavaScript和注册表脚本。 步骤如下: 创建一个新的注册表脚本文件,将其保存为 .reg 文件类型。 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\Collect] @="收藏选中文本" [HKEY…

    Java 2023年6月15日
    00
  • java8之LocalDate的使用、LocalDate格式化问题

    当我们需要处理日期时,java.time.LocalDate是一个很好的选择。LocalDate类代表了一个ISO格式的日期(yyyy-MM-dd),并且提供了一些用于操作日期的方法。下面是一个使用LocalDate的示例: import java.time.LocalDate; public class LocalDateExample { public …

    Java 2023年5月20日
    00
  • java中全排列的生成算法汇总

    Java中全排列的生成算法汇总 一、什么是全排列 全排列,是指将一组数按一定顺序进行排列,称为这组数的全排列。 如有三个数a、b、c,则它们的全排列有:a、b、c、ab、ac、ba、bc、ca、cb、abc、acb、bac、bca、cab、cba 共6个。 二、生成全排列的算法 在Java中,生成全排列的算法有以下几种: 1.递归算法 这种算法实现简单,思路…

    Java 2023年5月19日
    00
  • Java Swing 多线程加载图片(保证顺序一致)

    Java Swing 多线程加载图片是一种在图形界面中快速显示大量图片的思路。在实现过程中,通过多线程并发加载图片,可以提高程序的运行效率,同时通过”保证顺序一致”的要求,可以使得程序在显示图片时始终保持正确的顺序,避免了一些错误和混淆。下面是交互过程及详细攻略。 交互过程 用户打开网站后,滑动页面会有几百张被切割成小图片的性感美女图片实时刷新显示,用户可以…

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