天天看點

java源碼學習(一)

AtomicBoolean源碼分析

Java不能直接通路作業系統底層,而是通過本地方法來通路。Unsafe類提供了硬體級别的原子操作,主要提供了以下功能:

1、通過Unsafe類可以配置設定記憶體,可以釋放記憶體;

2、可以定位對象某字段的記憶體位置,也可以修改對象的字段值,即使它是私有的;

3、挂起與恢複

4、CAS操作:是通過compareAndSwapXXX方法實作的

詳細内容請參考http://www.cnblogs.com/mickole/articles/3757278.html

[img]http://dl2.iteye.com/upload/attachment/0126/1463/3daaa850-32be-3e93-bdec-574e9ef84e72.png[/img]

unsafe.objectFieldOffset(AtomicBoolean.class.getDeclaredField("value"));

objectFieldOffset()方法用于擷取某個字段相對Java對象的“起始位址”的偏移量

一個java對象可以看成是一段記憶體,各個字段都得按照一定的順序放在這段記憶體裡,同時考慮到對齊要求,可能這些字段不是連續放置的,用這個方法能準确地告訴你某個字段相對于對象的起始記憶體位址的位元組偏移量,因為是相對偏移量,是以它其實跟某個具體對象又沒什麼太大關系,跟class的定義和虛拟機的記憶體模型的實作細節更相關。

unsafe.compareAndSwapInt比較obj的offset處記憶體位置中的值和期望的值,如果相同則更新。此更新是不可中斷的

compareAndSet、weakCompareAndSet、getAndSet都是通過unsafe.compareAndSwapInt的方法來實作業務邏輯的!

lazySet方法 通過 unsafe.putOrderedInt(this, valueOffset, v) 方法實作

設定obj對象中offset偏移位址對應的整型field的值為指定值。這是一個有序或者有延遲的方法,并且不保證值的改變被其他線程立即看到。隻有在field被修飾并且期望被意外修改的時候使用才有用。

AtomicInteger 源碼分析

[img]http://dl2.iteye.com/upload/attachment/0126/1626/2cd73abd-adad-32e1-8a3f-8132fcce9e54.png[/img]

AtomicInteger 圖上這些方法和AtomicBoolean的套路一樣,主要不同的是下面這些方法:

[img]http://dl2.iteye.com/upload/attachment/0126/1628/0dfb62b3-cf4a-3485-88bd-c0ae7ba4fac9.png[/img]

[img]http://dl2.iteye.com/upload/attachment/0126/1630/e3d13bb3-e014-336a-99db-03f7f501569a.png[/img]

AtomicInteger 的 getAndIncrement、getAndDecrement、getAndAdd、incrementAndGet、decrementAndGet、addAndGet 都是使用unsafe.getAndAddInt方法直接操作底層記憶體偏移位址對應的整型數值進行加減操作!

getAndAccumulate、accumulateAndGet、updateAndGet方法都是通過輸入IntUnaryOperator接口類型的參數來實作邏輯的!這個類型是Java 8中新增加了一個包 java.util.function,帶來了常用的 Lambda 表達式函數式接口,也就是箭頭函數。這些方法都是jdk1.8以後開始提供的!

[img]http://dl2.iteye.com/upload/attachment/0126/1632/b8d09189-f74f-3e1b-b8d4-8bbc760cd552.png[/img]

jdk1.8之後提供的方法:

getAndAccumulate(int x, IntBinaryOperator accumulatorFunction)自動更新目前值與給定的功能應用到目前和給定值的結果,傳回前一個值。

accumulateAndGet(int x, IntBinaryOperator accumulatorFunction) 自動更新目前值與給定的功能應用到目前和給定值的結果,傳回更新後的值。

updateAndGet(IntUnaryOperator updateFunction) 自動更新目前值與結果應用給定的函數,傳回更新後的值。

Interface IntUnaryOperator

這是一個功能接口,是以可以作為指派的目标一個lambda表達式或方法參考。

代表在一個單一的 int-valued操作數,産生一個 int-valued結果操作。這是 int的 UnaryOperator原始類型的專業化。

這是一個functional interface其功能的方法是applyAsInt(int)。

AtomicLong 和AtomicInteger所提供的方法差不多,大部分都是把方法傳回的類型改成了Long,但是源碼有一處代碼引起了我的注意:

[img]http://dl2.iteye.com/upload/attachment/0126/1634/26be07d5-2ce0-303f-a9a0-499cc26543cc.png[/img]

AtomicReference<V> 也不多說了 這四個基本類型懂一個另外三個也就明白了!