1. 程式人生 > >Java中的Atomic包使用指南:AtomicInteger、AtomicBoolean、AtomicIntegerArray、AtomicReference……

Java中的Atomic包使用指南:AtomicInteger、AtomicBoolean、AtomicIntegerArray、AtomicReference……

本文首發於併發網,作者:方騰飛

引言

Java從JDK1.5開始提供了java.util.concurrent.atomic包,方便程式設計師在多執行緒環境下,無鎖的進行原子操作。原子變數的底層使用了處理器提供的原子指令,但是不同的CPU架構可能提供的原子指令不一樣,也有可能需要某種形式的內部鎖,所以該方法不能絕對保證執行緒不被阻塞。

Atomic包介紹

在Atomic包裡一共有12個類,四種原子更新方式,分別是原子更新基本型別,原子更新陣列,原子更新引用和原子更新欄位。Atomic包裡的類基本都是使用Unsafe實現的包裝類。

原子更新基本型別類

用於通過原子的方式更新基本型別,Atomic包提供了以下三個類:

  • AtomicBoolean:原子更新布林型別。
  • AtomicInteger:原子更新整型。
  • AtomicLong:原子更新長整型。

AtomicInteger的常用方法如下:

  • int addAndGet(int delta) :以原子方式將輸入的數值與例項中的值(AtomicInteger裡的value)相加,並返回結果
  • boolean compareAndSet(int expect, int update) :如果輸入的數值等於預期值,則以原子方式將該值設定為輸入的值。
  • int getAndIncrement():以原子方式將當前值加1,注意:這裡返回的是自增前的值。
  • void lazySet(int newValue):最終會設定成newValue,使用lazySet設定值後,可能導致其他執行緒在之後的一小段時間內還是可以讀到舊的值。關於該方法的更多資訊可以參考併發網翻譯的一篇文章《
    AtomicLong.lazySet是如何工作的?
  • int getAndSet(int newValue):以原子方式設定為newValue的值,並返回舊值。

AtomicInteger例子程式碼如下:

01 import java.util.concurrent.atomic.AtomicInteger;
02
03 public class AtomicIntegerTest {
04
05
static AtomicInteger ai = new AtomicInteger(1);
06
07 public static void main(String[] args) {
08 System.out.println(ai.getAndIncrement());
09 System.out.println(ai.get());
10 }
11
12 }

輸出

1
2

餐後甜點

Atomic包提供了三種基本型別的原子更新,但是Java的基本型別裡還有char,float和double等。那麼問題來了,如何原子的更新其他的基本型別呢?Atomic包裡的類基本都是使用Unsafe實現的,讓我們一起看下Unsafe的原始碼,發現Unsafe只提供了三種CAS方法,compareAndSwapObject,compareAndSwapInt和compareAndSwapLong,再看AtomicBoolean原始碼,發現其是先把Boolean轉換成整型,再使用compareAndSwapInt進行CAS,所以原子更新double也可以用類似的思路來實現。

原子更新陣列類

通過原子的方式更新數組裡的某個元素,Atomic包提供了以下三個類:

  • AtomicIntegerArray:原子更新整型數組裡的元素。
  • AtomicLongArray:原子更新長整型數組裡的元素。
  • AtomicReferenceArray:原子更新引用型別數組裡的元素。

AtomicIntegerArray類主要是提供原子的方式更新數組裡的整型,其常用方法如下

  • int addAndGet(int i, int delta):以原子方式將輸入值與陣列中索引i的元素相加。
  • boolean compareAndSet(int i, int expect, int update):如果當前值等於預期值,則以原子方式將陣列位置i的元素設定成update值。

例項程式碼如下:

01 public class 

相關推薦

JavaAtomic的原理和分析

原文地址:http://blog.csdn.net/zhangerqing/article/details/43057799 Atomic簡介 Atomic包是Java.util.concurrent下的另一個專門為執行緒安全設計的Java包,包含多個原子操作類。這個

java的檔案操作讀取寫入byte[]位元組流string字串list列表

全棧工程師開發手冊 (作者:欒鵬) java中檔案操作:讀取檔案成位元組流,將位元組流寫入檔案,按行讀取檔案成字串列表,將字串列表儲存成檔案,讀取檔案成字串,將字串寫入檔案。 主

24.Javaatomic的原子操作類總結

tun 添加 原來 說明 array 內存地址 void rri delta 1. 原子操作類介紹 在並發編程中很容易出現並發安全的問題,有一個很簡單的例子就是多線程更新變量i=1,比如多個線程執行i++操作,就有可能獲取不到正確的值,而這個問題,最常用的方法是通過Sy

JavaAtomic使用指南AtomicIntegerAtomicBooleanAtomicIntegerArrayAtomicReference……

本文首發於併發網,作者:方騰飛 引言 Java從JDK1.5開始提供了java.util.concurrent.atomic包,方便程式設計師在多執行緒環境下,無鎖的進行原子操作。原子變數的底層使用了處理器提供的原子指令,但是不同的CPU架構可能提供的原子指令

房上的貓java

編碼規範 不能訪問 package 選項 imp src 前綴 alt cli 包 1.作用: (1)包允許將類組合成較小的單元(類似文件夾),易於找到和使用相應的類文件 (2)防止命名沖突: java中只有在不同包中的類才能重名 (3)包允許在更廣的範圍內保護

Java atomic 類底層機制協程

1、Java 中atomic 類底層機制 atomic類:AtomicInteger 等,其底層使用CAS機制,CAS 的底層實現時unsafe的compareAndSwapInt(this,valueOffset, expect, update)方法,其保證V , A, B 的原子性;CAS

#Java乾貨分享一篇文章讓你深入瞭解Java和介面

很多新手程式設計師對於Java中兩個具創新性的特徵————包與介面不是非常清楚,所以我特意發了這篇文章來闡述什麼是包,什麼是介面。 包(package)是多個類的容器,它們用於保持類的名稱空間相互隔離。 如果有想學習java的程式設計師,可來我們的java學習扣qun:79979,2590免

JAVA面向物件基礎抽象類初始化塊

本文轉載連線為:http://android.yaohuiji.com/archives/3241 一、抽象類 用 abstract 修飾的類定義,我們稱之為抽象類,抽象類不能被例項化。 用 abstract 修飾的方法,我們稱之為抽象方法,抽象方法不能有方法體。 面向物

javaAtomic類之AtomicInteger-api

Class AtomicInteger All Implemented Interfaces: public class AtomicInteger extends Number impl

java 概念

包名 span com文件 就會 port 管理 文件 anim java   Java 中的包package, 就相當於電腦中的文件夾。我們平時在工作中,文件太多時,都會新建文件夾進行分類管理,java 中的包也是類似的道理,當我們的類太多時,也需要進行管理。這時我們就會

關於JavaAtomic用法求助

cep rac 並發 exception final run @override head ger 最近在學高並發的一些知識,在學到Atomic時,運行程序,與預期不一樣 代碼如下 public class Learn13 { AtomicInteger coun

Java動態代理方式

tint lap cto getname AI clas tcl show this JDK中生成代理對象的API 代理類所在包:java.lang.reflect.ProxyJDK實現代理只需要使用newProxyInstance方法,但是該方法需要接收三個參數,完整的

JAVAjar和war的區別是

服務器 直接 jar文件 tomcat服務 一起 是把 目的 相關 web 其實jar包和war包都可以看成壓縮文件,用解壓軟件都可以打開,jar包和war包所存在的原因是,為了項目的部署和發布,通常把項目打包,通常在打包部署的時候,會在裏面加上部署的相關信息。 這個打包實

Java掃描(工具)

在現在好多應用場景中,我們需要得到某個包名下面所有的類, 包括我們自己在src裡寫的java類和一些第三方提供的jar包裡的類,那麼怎麼來實現呢? 今天帶大家來完成這件事。 先分享程式碼: 1 package com.mec.packscanner.core; 2 3 import

Java陣列的補充方法(增強版遍歷逆序氣泡排序二分法查詢)

陣列的補充方法 在《陣列》文章中簡單的介紹了陣列的基本格式和實現案例,此處不做說明,此文主要是補充一些陣列的使用方法。例如:增強版的遍歷、逆序、氣泡排序、二分法查詢。 增強版遍歷: 1.與普通遍歷的區別: 普通的遍歷給人的直觀感覺不是很好,輸出的元素都是排列不好看,所以需

javajar的生成與使用

什麼是jar包? JAR檔案的全稱是Java Archive File,意思是Java檔案檔案。是一種壓縮檔案,與常見的ZIP壓縮檔案相容。兩者最大的區別是在JAR檔案中預設包含一個名為META-INF/MANIFEST.MF的清單檔案,這個檔案是生成JAR檔案時由系統自動建立的。 使用

Java(建立及引用)的類的編譯

Java中帶包(建立及引用)的類的編譯 Java中帶包(建立及引用)的類的編譯與除錯 java源程式的編譯大家都知道,也就是cmd中到原始檔所在目錄下javac **.java即可,當程式中有包宣告還能簡簡單單的直接javac **.java嗎?答案當然是no,下面舉個簡單的例子證明一下直接

2.2 Java(package)

為了更好地組織類,Java 提供了包機制,用於區別類名的名稱空間。 包的作用 1、把功能相似或相關的類或介面組織在同一個包中,方便類的查詢和使用。 2、如同資料夾一樣,包也採用了樹形目錄的儲存方式。同一個包中的類名字是不同的,不同的包中的類的名字是可以相同的,當同時呼叫兩個

java的集合框架Collection 和Map

集合:包含多個元素的物件,又稱容器。 集合框架:一個代表、操作集合的統一架構,所有的集合框架都包含:介面、實現類以及演算法。 **介面:**表示集合的抽象資料型別。介面允許我們操作集合時不必關注具體實現,從而達到“多型”。在面向物件程式語言中,介面通常用來形成規範。 **實現類:**

C#的名稱空間namespace與Javapackage之間的區別

Java 包被用來組織檔案或公共型別以避免型別衝突。包結構可以對映到檔案系統。 System.Security.Cryptography.AsymmetricAlgorithm aa; 可能被替換: import System.Security.Crypography; class xxx { .