1. 程式人生 > >二、多執行緒之Atomic包

二、多執行緒之Atomic包

一、簡介

1、原子操作

我們在使用變數的時候,經常會出現資源競爭的情況,為了保證變數安全,我們就會對對應的方法新增"synchronized"同步鎖來達到目的,以保證執行緒安全。

而原子操作時一種執行緒安全的操作,在操作執行期間不會穿插任何操作。這意味著,我們不需要使用synchronized等同步序列機制去控制資源的訪問。

2、atomic包

JDK在1.5已經開始提供了一些原子類,在:java.util.concurrent.atomic軟體包下

這個包下提供了對int、long、array等的原子操作,簡單來說,我們可以通過複用這些現有的類來達到執行緒安全的目的。

JDK文件:

http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/concurrent/atomic/package-frame.html

 

二、AtomicLong

以下,AtomicLong為例:

java.util.concurrent.atomic.AtomicLong類:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/concurrent/atomic/AtomicLong.html

直接繼承於Number類

這表明,使用它就像使用Number類一樣簡單,它就像是一個基本型別的包裝類

1)初始化一個值

// 預設初始值為0
public AtomicLong atomicLong = new AtomicLong();
// 也可以賦值
public AtomicLong atomicLong = new AtomicLong(10L);

2)加

// 返回更新的值
atomicLong.addAndGet(1L)
// 返回更新前的值
atomicLong.getAndAdd(1L)

3)自增

// 自增,返回更新的值
atomicLong.incrementAndGet();
// 自增,返回舊的值
atomicLong.getAndIncrement()

4)自減

// 自減,返回更新的值
atomicLong.decrementAndGet();
// 自減,返回舊的值
atomicLong.getAndDecrement();

5)設定值

// 設定值
atomicLong.set(10L);
// 最後設定為給定值
atomicLong.lazySet(10L);
// 設定值,返回舊值
atomicLong.getAndSet(2L);
// 如果當前值 == 預期的值 那麼設定為給定值
atomicLong.compareAndSet(1L, 2L);
// 如果當前值 == 預期的值 那麼設定為給定值
atomicLong.weakCompareAndSet(1L, 2L);

6)型別轉換

// 返回double
atomicLong.doubleValue();
// 返回float
atomicLong.floatValue();
// 返回int
atomicLong.intValue();
// 返回long
atomicLong.longValue();
// 轉換為字串
atomicLong.toString();

7)獲取當前值

atomicLong.get()

我們看到以上羅列的一些操作,把很多複合操作都變成了原子操作。還有一些常用的原子類,如:AtomicInterger、AtomicReference等類同