AtomicInteger介绍

本文介绍了Java中的AtomicInteger类,该类提供了线程安全的整数原子操作接口,避免了在多线程环境下使用synchronized关键字。文中列举了AtomicInteger的主要方法并给出了测试示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     AtomicInteger是一个提供原子操作的Integer的类。在java中i++或++i操作并不是线程安全的,在使用的时候,

不可避免的会使用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。

先看看AtomicInteger提供的接口:

public final int get(); //获取当前的值

public final int getAndSet(int newValue); //取当前的值,并设置新的值

public final int getAndIncrement(); //获取当前的值,并自增

public final int getAndDecrement();//获取当前的值,并自减

public final int getAndAdd(int delta);//获取当前的值,并加上预期的值

测试代码如下:

package com.test.auto;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @ClassName: ThreadTest
 * @Description:
 * @date 2017-2-7 上午10:55:13
 * 
 */
public class ThreadTest {

	public static void main(String[] args) {
		AtomicInteger ai = new AtomicInteger(0);
		int i1 = ai.get();
		v(i1);
		int i2 = ai.getAndSet(5);
		v(i2);
		int i3 = ai.get();
		v(i3);
		int i4 = ai.getAndIncrement();
		v(i4);
		v(ai.get());

	}

	public static void v(int i) {
		System.out.println("i : " + i);
	}
}
打印:



### 使用 `AtomicInteger` 实现数字减法 #### 方法介绍Java 中,`AtomicInteger` 提供了专门用于执行原子减法的方法。以下是两个主要的减法方法: 1. **`decrementAndGet()`**: 将当前值减去 1,并返回新的值。 2. **`getAndDecrement()`**: 返回当前值并将当前值减去 1。 这两种方法均基于 CAS(Compare-And-Swap)机制实现,确保操作在线程间的可见性和原子性[^1]。 #### 示例代码 下面是一段使用 `AtomicInteger` 完成减法操作的例子: ```java import java.util.concurrent.atomic.AtomicInteger; public class AtomicIntegerDecrementExample { private static AtomicInteger counter = new AtomicInteger(10); // 初始化为 10 public static void main(String[] args) { // 减一之前获取原始值 int oldValue = counter.get(); System.out.println("初始值: " + oldValue); // 使用 getAndDecrement() int valueAfterGetAndDecrement = counter.getAndDecrement(); System.out.println("getAndDecrement() 执行后的旧值: " + valueAfterGetAndDecrement); System.out.println("当前值: " + counter.get()); // 使用 decrementAndGet() int valueAfterDecrementAndGet = counter.decrementAndGet(); System.out.println("decrementAndGet() 执行后的新值: " + valueAfterDecrementAndGet); System.out.println("当前值: " + counter.get()); } } ``` 运行上述代码将输出如下结果: ``` 初始值: 10 getAndDecrement() 执行后的旧值: 10 当前值: 9 decrementAndGet() 执行后的新值: 8 当前值: 8 ``` 这段代码清晰地展示了两种不同形式的减法操作及其效果[^1]。 #### 多线程环境下的应用 类似于自增操作,在多线程环境中,`AtomicInteger` 的减法同样表现出色。它避免了传统锁可能引发的性能瓶颈问题,同时保持数据的一致性。 ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; public class MultiThreadedDecrementor { private static final int THREAD_COUNT = 5; private static final int DECREMENTS_PER_THREAD = 1_000_000; private static AtomicInteger sharedCounter = new AtomicInteger(THREAD_COUNT * DECREMENTS_PER_THREAD); public static void main(String[] args) throws InterruptedException { ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT); for (int i = 0; i < THREAD_COUNT; i++) { executor.submit(() -> { for (int j = 0; j < DECREMENTS_PER_THREAD; j++) { sharedCounter.decrementAndGet(); // 原子减法 } }); } executor.shutdown(); executor.awaitTermination(1, TimeUnit.MINUTES); long expectedValue = 0L; System.out.printf("Expected Value: %d%n", expectedValue); System.out.printf("Actual Counter Value: %d%n", sharedCounter.get()); } } ``` 在此示例中,尽管多个线程同时对共享变量进行修改,但由于 `AtomicInteger` 的内在保障机制,最终仍能得到预期的结果[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值