9 C/ C5 g( L1 a6 p+ B5 K8 mprivate static final long valueOffset;: c: J5 l7 B% |0 X( w
* k# D* T+ k8 Tprivate volatile int value; : H% u% `. k, J( b$ ` 2 c9 [6 P0 C8 T7 H* |5 c/ Z静态代码块: / a4 F- Z9 R) ^! Lstatic { % \( D2 E* \5 C3 R1 j+ P try {5 [. X3 u! Z, U0 \
valueOffset = unsafe.objectFieldOffset 6 {5 }' a7 ?$ l' ~) a (AtomicInteger.class.getDeclaredField("value"));* C& M3 C* R' x1 R
} catch (Exception ex) { throw new Error(ex); } $ {+ H3 P( Q5 q- B( ^0 G } " C+ ~/ o2 S" I6 m9 ] Y--------------------- 0 i% g2 ]6 f1 \$ G构造方法 [/ I; C# w6 C: N8 W' V& Z
public AtomicInteger() {$ P5 h" ]8 o. e. x2 ~
} + o; h/ o9 e$ L {+ Y" ^ ; m* G% v+ c% K! b; `" r. W9 @public AtomicInteger(int initialValue) {4 j$ c* k- ]' e2 F
value = initialValue; 2 i: n$ R6 X, N3 E } . {) d2 F: q* r. \7 P! }5 O, @) ^: Y4 [5 d( o U
对象方法:* X' g4 d+ L4 N2 Y) @9 T& Q
public final int get() { 2 G- D( |/ t6 ~9 i# D( v8 J return value; 7 s! W* \& j! C+ x9 c2 f4 w }7 @ {% O$ I, E( }# W( k
- _7 H0 E) J. q3 w y6 h7 J+ M6 `6 C
8 a, E3 S B% C+ ppublic final void set(int newValue) {3 }- l' L0 g! c
value = newValue;5 u+ U0 v Z5 ~2 x# \$ j0 ~
} 9 @' Q. r% w4 N4 O- T' J& n: o% S8 q
$ D4 a0 p- L) Z5 V) opublic final void lazySet(int newValue) {2 u0 i+ s; ?) V) M
unsafe.putOrderedInt(this, valueOffset, newValue); 0 Z. S& C! K, n( ?$ [4 B }. R* Q+ p$ N3 K( C- c ]- R% A! i
8 |. d( H3 x1 Z' d; I6 C6 V) u% |
public final int getAndSet(int newValue) { , L6 {) a& X/ z- U+ d3 G& c for (;;) { ' Q _, Q! e; L9 s/ E1 ^ a" L int current = get();+ j4 W% T# B5 `, t \& f
if (compareAndSet(current, newValue)) * K e5 p4 R% k" v2 K# j return current; ; u3 M: P+ l! B0 N. R }6 K! d* g/ \) d$ f. v8 R- p& u2 N
}9 @! B0 A; a. T# D' x) X
0 @! ]) B0 P9 p5 h1 [6 H; T1 u/ i) B2 m" K7 S4 F( |- b$ Q
public final boolean compareAndSet(int expect, int update) { . b& ^0 U" Q" I$ Z: p) w return unsafe.compareAndSwapInt(this, valueOffset, expect, update); 8 k; A# Y; U. j } 1 |) N& a) S. t: q! V& J. r/ N
# J3 t! K: D2 ~2 s4 ?( j
public final boolean weakCompareAndSet(int expect, int update) { . T5 i, |2 I, j9 ` return unsafe.compareAndSwapInt(this, valueOffset, expect, update); $ r5 H* w/ D: @% l } 1 K; v1 F" x+ w& [2 y' n5 M' s9 o+ ~& N9 j: C9 g9 K
public final int getAndIncrement() {9 x/ W" i+ j* |; W
for (;;) { . p% D1 V$ c1 X( A9 R: Y int current = get();' M- Z$ g2 z0 _+ f
int next = current + 1; 5 l" g9 E& z1 w/ |4 Z% K if (compareAndSet(current, next))" T4 K1 `& }# @) _/ T
return current;& H# B ^+ n/ R8 p5 o+ d; Q( }" R+ j
} ! R( L1 \ J! ]4 G, U } " O2 ?+ A+ L% x; X& p% e2 h. v: k4 o
public final int getAndDecrement() { : c8 I; C! y$ x9 b; i1 c3 X for (;;) { 4 F1 A6 M1 V, }: n+ `! z0 V int current = get(); 9 R- P8 e# F/ E; L int next = current - 1;+ E4 |- Q8 s& b' l* T9 J5 h
if (compareAndSet(current, next)): J% ` T# g. q
return current;+ l8 y) C6 ^8 D+ ~+ ?5 I) e& C
} q/ X: {" N! i) p: S4 B; f }7 m9 A K* N0 v) Z* y4 v4 h8 A
3 T2 G4 R. A' T/ Y; @! d
) D0 d# t: N& j, `( d4 r' |
public final int getAndAdd(int delta) {5 i) O4 k! V- }0 p$ a* d
for (;;) { + q" T, }+ L5 ~$ l" x' D" \ int current = get();' ], U! v5 a: G" [8 B4 H& _2 }) K3 i) e2 ?
int next = current + delta; . A- I4 J' e6 k' o# o- u3 i& o if (compareAndSet(current, next)) / y* _% F# v+ I, h, | return current;* F7 A" h# _( q& O, k8 V, R
}- n6 q k' J# f6 |3 n! U0 e
}7 V: v% Q- b3 D0 R) E4 a( o
/ }( ~8 o& I1 i2 c; |+ y4 e
& J" C2 l7 c" i) D) F
public final int incrementAndGet() {1 H% S S( j1 D! H8 Z
for (;;) {5 p& a" r9 o5 m7 F
int current = get();$ k. g% Y1 o7 _3 ?( _
int next = current + 1; 7 R' d% E& Y- m6 w+ z if (compareAndSet(current, next)) O( M' m" { v+ L9 ~5 w return next; ( W! @7 ~6 U: r; S } + \6 O! Z3 c' F: Q }% G4 i" }3 s5 H/ C& |* R& w6 F7 a
& p" Q* T- B# U V M i0 j% G i 4 q& c4 D7 k/ } |) c5 }8 b8 vpublic final int decrementAndGet() {( i3 @4 M. y7 D$ W5 }
for (;;) {. o; [% O/ s1 p$ k3 }# ?3 l
int current = get();3 c7 w/ V8 L y$ r/ u6 W
int next = current - 1; . X+ t4 N2 o6 E( [3 @( k7 F if (compareAndSet(current, next))( C, k8 n" y8 ^" f# k4 ~
return next; 8 v& `" ] J4 i& R+ n* X } 6 w+ \: D# |- w" q# }& u x }% s1 N; u1 x6 m y
" Q9 B* _6 `; W$ r' `4 ]( s
+ C2 y) h4 z7 zpublic final int addAndGet(int delta) {7 }( A& n8 _1 C" X9 [
for (;;) { ! Y6 t2 f- @5 v5 F) P0 _ int current = get();3 l+ h) q4 d# t& |
int next = current + delta; / P9 n+ Q7 [" Y. | if (compareAndSet(current, next)), r; f; e2 g, G0 q$ m3 R7 I
return next; 5 G: l9 X- c- i7 p" k } ; n" k. A" v( N$ l } / ^# X, b4 Q7 [5 z2 @% j3 w, ?7 c
9 s. s' g' L/ }* x- T+ q! d
public String toString() { + U2 R) b5 R* Q; g! e2 d# `/ K* b return Integer.toString(get());" E# F0 i/ B1 Q: o+ w0 c
}, a8 E u* F; d( e( ^/ q
5 P- V+ C0 X2 H5 V3 O* m W: j7 a% {. T: j4 x* i. s7 j" O7 i
public int intValue() { 0 {: o5 t& G* n5 W; C9 p1 D return get(); 9 X# g! o3 u1 o, [# o: L* Y3 u4 Y, F: @ }9 ` f1 C, C4 X' Y1 g3 _
0 p+ C7 L2 z" d" D+ f F/ t2 o* l L0 G# |1 e( e
public long longValue() { - v `! P S) T: a return (long)get();* [$ @% W6 t# d! D" w7 [8 x" c) t4 _
}: T4 K4 U& e. p$ q- O
; L; Y" m) E2 P5 B+ h6 F7 ? ! [" ^+ w9 F" Zpublic float floatValue() {, y9 q7 V6 x6 [3 W- F
return (float)get(); 9 {* X- }( K K$ E }" B6 L5 p D7 w" G) e
) G0 a; Q# b! V/ z2 g: ^9 W8 }