1钙姊、背景
Java從JDK1.5開始提供了java.util.concurrent.atomic包送浊,這個包中的原子操作類提供了一種用法簡單博秫,性能高效边灭,線程安全地更新一個變量的方式异希。
Atomic包里一共提供了13個類,屬于4種類型的原子更新方式绒瘦,分別是原子更新基本類型称簿,原子更新數(shù)組,原子更新引用和原子更新屬性惰帽。
Atomic包里的類基本都是使用Unsafe實現(xiàn)的包裝類憨降。
2、原子更新基本類型
Atomic包提供了以下3個類:AtomicBoolean该酗、AtomicInteger授药、AtomicLong士嚎。
Unsafe只提供了3種CAS方法:compareAndSwapObject、compareAndSwapInt悔叽、compareAndSwapLong莱衩,再看AtomicBoolean源碼,發(fā)現(xiàn)它是將Boolean轉(zhuǎn)換成整型娇澎,再使用compareAndSwapInt進(jìn)行CAS笨蚁,所以原子更新char、float和double變量也可以用類似的思路來實現(xiàn)趟庄。
3赚窃、原子更新數(shù)組?
Atomic包提供了以下3個類:AtomicIntegerArray、AtomicLongArray岔激、AtomicReferenceArray勒极。
4、原子更新引用類型?
Atomic包提供了以下3個類:AtomicReference虑鼎、AtomicReferenceFieldUpdater辱匿、AtomicMarkableReference(原子更新帶有標(biāo)記位的引用類型§挪剩可以原子更新一個布爾類型的標(biāo)記位和引用類型匾七。。
5江兢、原子更新字段類??
Atomic包提供了以下3個類:AtomicIntegerFieldUpdater昨忆、AtomicLongFieldUpdater、AtomicStampedFieldUpdater(更新帶有版本號的引用類型)杉允。
要想原子地更新字段類需要兩步邑贴。第一步,因為原子更新字段類都是抽象類叔磷,每次使用的時候必須使用靜態(tài)方法newUpdater()創(chuàng)建一個更新器拢驾,并且需要設(shè)置想要更新的類和屬性。第二步改基,更新類的字段必須使用public volatile修飾符