JUC原子类-基本类型(二)
生活随笔
收集整理的這篇文章主要介紹了
JUC原子类-基本类型(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
AtomicLong介紹:
AtomicLong是作用是對長整形進行原子操作。
在32位操作系統中,64位的long 和 double 變量由于會被JVM當作兩個分離的32位來進行操作,所以不具有原子性。而使用AtomicLong能讓long的操作保持原子型。
AtomicLong函數列表
// 構造函數 AtomicLong() // 創建值為initialValue的AtomicLong對象 AtomicLong(long initialValue) // 以原子方式設置當前值為newValue。 final void set(long newValue) // 獲取當前值 final long get() // 以原子方式將當前值減 1,并返回減1后的值。等價于“--num” final long decrementAndGet() // 以原子方式將當前值減 1,并返回減1前的值。等價于“num--” final long getAndDecrement() // 以原子方式將當前值加 1,并返回加1后的值。等價于“++num” final long incrementAndGet() // 以原子方式將當前值加 1,并返回加1前的值。等價于“num++” final long getAndIncrement() // 以原子方式將delta與當前值相加,并返回相加后的值。 final long addAndGet(long delta) // 以原子方式將delta添加到當前值,并返回相加前的值。 final long getAndAdd(long delta) // 如果當前值 == expect,則以原子方式將該值設置為update。成功返回true,否則返回false,并且不修改原值。 final boolean compareAndSet(long expect, long update) // 以原子方式設置當前值為newValue,并返回舊值。 final long getAndSet(long newValue) // 返回當前值對應的int值 int intValue() // 獲取當前值對應的long值 long longValue() // 以 float 形式返回當前值 float floatValue() // 以 double 形式返回當前值 double doubleValue() // 最后設置為給定值。延時設置變量值,這個等價于set()方法,但是由于字段是volatile類型的,因此次字段的修改會比普通字段(非volatile字段)有稍微的性能延時(盡管可以忽略),所以如果不是想立即讀取設置的新值,允許在“后臺”修改值,那么此方法就很有用。如果還是難以理解,這里就類似于啟動一個后臺線程如執行修改新值的任務,原線程就不等待修改結果立即返回(這種解釋其實是不正確的,但是可以這么理解)。 final void lazySet(long newValue) // 如果當前值 == 預期值,則以原子方式將該設置為給定的更新值。JSR規范中說:以原子方式讀取和有條件地寫入變量但不 創建任何 happen-before 排序,因此不提供與除 weakCompareAndSet 目標外任何變量以前或后續讀取或寫入操作有關的任何保證。大意就是說調用weakCompareAndSet時并不能保證不存在happen-before的發生(也就是可能存在指令重排序導致此操作失敗)。但是從Java源碼來看,其實此方法并沒有實現JSR規范的要求,最后效果和compareAndSet是等效的,都調用了unsafe.compareAndSwapInt()完成操作。 final boolean weakCompareAndSet(long expect, long update)incrementAndSet方法:
public final long incrementAndGet() {for (;;) {// 獲取AtomicLong當前對應的long值long current = get();// 將current加1long next = current + 1;// 通過CAS函數,更新current的值if (compareAndSet(current, next))return next;} }incrementAndGet()首先會根據get()獲取AtomicLong對應的long值。該值是volatile類型的變量,get()的源碼如下:
// value是AtomicLong對應的long值 private volatile long value; // 返回AtomicLong對應的long值 public final long get() {return value; }incrementAndGet()接著將current加1,然后通過CAS函數,將新的值賦值給value。
compareAndSet()的源碼如下:
解釋一個CAS
CAS是Compare And Set的一個簡稱,如下理解:
將值和內存中的值進行比較,比較成功則修改內存,對比失敗則輪詢判斷,知道比較成功就修改。
總結
以上是生活随笔為你收集整理的JUC原子类-基本类型(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JUC原子类-框架(一)
- 下一篇: JUC原子类-数组类型(三)