AtomicInteger クラスは、下部に int 値を格納し、int 値に対してアトミックな操作を実行するメソッドを提供します。 AtomicInteger は、java.util.concurrent.atomic
パッケージの一部として Java 1.5 から導入されました。
1. AtomicInteger の基本的な使い方
次の AtomicInteger
構築メソッドにより、AtomicInteger
オブジェクトを作成できます。デフォルトは 0 です。 AtomicInteger
基になる int 整数値を取得し、int 整数値を設定するための get メソッドと set メソッドを提供します。
//初始值为0的atomicInteger对象 AtomicInteger atomicInteger = new AtomicInteger(); //初始值为200的atomicInteger对象 AtomicInteger atomicInteger = new AtomicInteger(200); int currentValue = atomicInteger.get(); //100 atomicInteger.set(2453); //现在的值是 2453
ただし、上記のメソッドは AtomicInteger
のコアには適していません。 content, AtomicInteger
コアのコンテンツはそのアトミック性に反映されており、これについては以下で紹介します。
2. AtomicInteger を使用する必要があるのはどのような場合ですか。
通常、次の 2 つのシナリオで使用します。AtomicInteger
マルチでカウンターを操作するには-スレッド同時シナリオでは、カウンター操作のアトミック性を確保する必要があります。
値を比較します。指定された値が現在の値と等しい場合は、値を更新し、操作にノンブロッキング アルゴリズムを実装します。
2.1. アトミック カウンター シナリオ
カウンターとして AtomicInteger
を使用する AtomicInteger
は、加算と減算のアトミック操作のためのメソッドをいくつか提供します。
たとえば、マップから値を取得するには、最初の操作である get() メソッドを使用します。値を取得した後、値に n を加算します (2 番目の操作)。加算操作です。 3 番目の操作は、マップに値を再度入力することです。いわゆる操作のアトミック性とは、マルチスレッドの同時実行シナリオでは、上記の 3 つの操作がアトミックである、つまり分割できないことを意味します。スレッド A が値を取得し、スレッド B も同時に値を取得するという状況はありません。2 つのスレッドは同時に値に対する操作を実行し、次々に値を再度入力します。この状況は、次のような場合には適していません。 AtomicInteger
AtomicInteger
操作はスレッドセーフで分割不可能であるように見えます。
addAndGet()
- 指定された値を現在の値に加算し、加算後に新しい値を返し、操作のアトミック性を確保します。
getAndAdd()
- 指定された値を現在の値に加算して古い値を返し、操作のアトミック性を確保します。
incrementAndGet()
- 現在の値を 1 ずつ増加させ、増加後の新しい値を返します。これは i
操作と同等であり、操作のアトミック性が保証されます。
getAndIncrement()
- 現在の値を 1 増やして、古い値を返します。 i
操作と同等であり、操作のアトミック性が保証されます。
decrementAndGet()
- 現在の値から 1 を減算し、減算後の新しい値を返します。これは i--
操作と同等であり、アトミック性が保証されます。手術のセックス。
getAndDecrement()
- 現在の値から 1 を減算し、古い値を返します。これは --i
操作と同等であり、操作のアトミック性が保証されます。
次は、AtomicInteger
public class Main { public static void main(String[] args) { //初始值为100的atomic Integer AtomicInteger atomicInteger = new AtomicInteger(100); System.out.println(atomicInteger.addAndGet(2)); //加2并返回102 System.out.println(atomicInteger); //102 System.out.println(atomicInteger.getAndAdd(2)); //先获取102,再加2 System.out.println(atomicInteger); //104 System.out.println(atomicInteger.incrementAndGet()); //加1再获取105 System.out.println(atomicInteger); //105 System.out.println(atomicInteger.getAndIncrement()); //先获取105再加1 System.out.println(atomicInteger); //106 System.out.println(atomicInteger.decrementAndGet()); //减1再获取105 System.out.println(atomicInteger); //105 System.out.println(atomicInteger.getAndDecrement()); //先获取105,再减1 System.out.println(atomicInteger); //104 } }
2.2 のアトミック操作メソッドの例です。数値比較および交換操作
compareAndSet 操作は、メモリ位置の内容を指定された値と比較します。 value 比較が行われ、それらが同一である場合にのみ、そのメモリ位置の内容が指定された新しい値に変更されます。このプロセスは、単一のアトミック操作として完了します。
compareAndSet メソッド: 現在の値 == 期待値の場合、値を指定された更新された値に設定します。
boolean compareAndSet(int expect, int update)
expect
は期待値
update
は更新された値
AtomicInteger CompareAndSet() メソッドの例
import java.util.concurrent.atomic.AtomicInteger; public class Main { public static void main(String[] args) { //初始值为100的atomic Integer AtomicInteger atomicInteger = new AtomicInteger(100); //当前值100 = 预期值100,所以设置atomicInteger=110 boolean isSuccess = atomicInteger.compareAndSet(100,110); System.out.println(isSuccess); //输出结果为true表示操作成功 //当前值110 = 预期值100?不相等,所以atomicInteger仍然等于110 isSuccess = atomicInteger.compareAndSet(100,120); System.out.println(isSuccess); //输出结果为false表示操作失败 } }
3. 概要
AtomicInteger
は、同期ロックを使用せずに、マルチスレッド シナリオでの int 数値操作のスレッド セーフ性とアトミック性を実現するのに役立ちます。また、AtomicInteger
を使用して int 値に対するアトミック操作を実装することは、同期された同期ロックを使用するよりもはるかに効率的です。
java.util.concurrent.atomic
パッケージは、AtomicInteger
を提供するだけでなく、AtomicBoolean Boolean アトミック操作クラスと AtomicLong long integer Boolean アトミック操作も提供します。 class 、AtomicReference オブジェクトのアトミック操作クラス、AtomicIntegerArray 整数配列のアトミック操作クラス、AtomicLongArray 長整数配列のアトミック操作クラス、AtomicReferenceArray オブジェクト配列のアトミック操作クラス。
以上がJava並行プログラミング:AtomicIntegerの使用例の分析 JUC ToolkitのAtomic Integerの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于设计模式的相关问题,主要将装饰器模式的相关内容,指在不改变现有对象结构的情况下,动态地给该对象增加一些职责的模式,希望对大家有帮助。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Dreamweaver Mac版
ビジュアル Web 開発ツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。
