二、多執行緒之Atomic包
阿新 • • 發佈:2018-12-23
一、簡介
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等類同