2 K+ u! H/ V% V! e属性: * X& C9 |# W, i k z! ~private static final Unsafe unsafe = Unsafe.getUnsafe();9 B7 j, a$ S. I
1 U: L$ ~. P3 Pprivate static final long valueOffset;% {# s, c) F' }8 X
: N8 m( }! k. n5 ]* ] l
private volatile int value;4 K% W7 y) X3 M5 g- E! P
6 \% ]# r! R0 x! B
静态代码块: 5 ]- f) q1 N1 Q! g3 @( x/ b% M1 i% m, zstatic {2 C. S% `8 S, F, ]! J
try { ! Q0 U, j% ^/ z3 A. M5 d$ ~* p valueOffset = unsafe.objectFieldOffset- |7 ~* L: t0 }3 ^
(AtomicInteger.class.getDeclaredField("value"));9 E! `" k7 [) d
} catch (Exception ex) { throw new Error(ex); } * o. C$ R, e" |( e } ! }5 C0 a5 S! D M--------------------- * j9 p' i8 _; F( u- U5 }构造方法0 k" T8 D3 S) o$ r* C
public AtomicInteger() {! D) p& ]& e* Y
}1 i0 r5 T' _# T/ I
4 b6 M, {3 \, ]' Q6 Gpublic AtomicInteger(int initialValue) { ! u# t1 R& H: G2 H' k4 a) o" | value = initialValue;& z2 c: v' T! b, v5 N: z
} ! O) E, q+ W: g& U& o; S- {3 x" \9 g% A
对象方法: + E4 z+ o9 A! m7 j7 { public final int get() {6 B4 } {- w. ~8 M& j4 z
return value;% T3 G- A1 f3 `0 {- j1 S3 y: W2 T
}' \8 I9 {3 z8 M; M) _! y* j
% S" A) K4 t6 X( U
: [0 h3 X# S1 P2 r
public final void set(int newValue) {2 [9 [! h' U' E" F
value = newValue;0 C7 G. S3 [; [8 x# k
} 2 S. n% @* C! R0 ^6 w; o & ~ u: r# n' k* Y) W' Z6 j/ X2 C! Y; e8 s1 i6 H
public final void lazySet(int newValue) { 6 r+ E, a! |: P6 `, \ unsafe.putOrderedInt(this, valueOffset, newValue); ' t x" S- P0 O/ L5 Y$ w0 D+ E }- l& C% o& C' h: s2 q: v
) W" d) `* f4 t: C8 J& b: Z 9 H0 ?* N5 I! {" C) t+ tpublic final int getAndSet(int newValue) { - F# ?$ v& o* h6 e/ N for (;;) { - Q' m4 b: u/ h" x0 x" L# y; ~ int current = get();7 k) n7 Y% V% \9 o
if (compareAndSet(current, newValue)) , Y$ u! E/ | \' x' _, R# P return current; }) I- C: u8 m# |% H& Q4 [ w; _ }! z8 C" V1 W# N0 L0 H- V/ r4 q6 y
} " t9 n' C" W6 R' F* Z + m$ t* f/ w% _' h( i1 \ ! {+ f6 e0 n% x0 e4 @! N6 [public final boolean compareAndSet(int expect, int update) { $ M% ^* T/ H8 \; ^7 Z7 h return unsafe.compareAndSwapInt(this, valueOffset, expect, update); 3 U/ y7 R. ~; X } 0 f" F; U0 r0 [# \9 ~# V6 `) W3 ~5 A
% s4 Y3 |$ [& X; i2 Npublic final boolean weakCompareAndSet(int expect, int update) {! j. E1 h+ B- g. @
return unsafe.compareAndSwapInt(this, valueOffset, expect, update); % d+ p( z1 t9 ~- I. \3 P$ ~ } ) h" ], _7 }2 v. L9 F7 p$ A0 N/ d9 a . y% ]/ B: w$ j+ S) [' I- Wpublic final int getAndIncrement() {, j5 H! }- A0 j7 b1 y W
for (;;) {: Z9 ]4 N1 Q# Q3 P0 t, s5 w3 \5 ]5 p, S/ }' \
int current = get();' O" M* t3 U# S, B
int next = current + 1; 3 N1 f( i: K1 x2 l2 S' @- r: S) X if (compareAndSet(current, next)). l- S+ @4 n- m5 `, K
return current;8 ?( Z8 l, C: K/ G2 I9 y# u
} 2 R6 g) E2 ?( E' x( y# P1 Q: K }2 [2 {" Q' H0 ]8 A8 ^3 Y
3 c7 s* C( \1 T1 Jpublic final int getAndDecrement() { g% j6 j' q$ l
for (;;) {1 t' H7 l$ a d% V9 _
int current = get(); 7 W( a/ t, y& F9 @. R# h0 I N4 ?- r int next = current - 1;/ Q, V U2 j; Q5 b( C
if (compareAndSet(current, next)) % e8 ?* `- s2 Y6 \6 ]/ a8 F return current; 6 L. F: V: F( V } ! @: `7 P2 }* v3 k8 u- [ } # f! H1 b: Z2 y" u/ [) P% r x7 I/ Z- S( v; k8 i+ r
9 w# d9 k1 D# x( R6 T, l
public final int getAndAdd(int delta) { 8 I" S, L" ~: }# @0 u! b for (;;) { 5 P' o2 F: _' e1 b; S" F( F3 A int current = get(); 2 U5 C1 M. f+ j0 P1 `$ U& Q int next = current + delta;/ Y0 j( o/ H% O Q2 Q4 n
if (compareAndSet(current, next))! `: F" K( [8 A+ X( e) a; Q
return current;/ R1 R' `: l/ t( g( J, {& d! z
}! T6 B8 ]$ w7 R1 _* H
}2 K/ B, G8 F+ |& u4 n: w2 e$ V! S" [, _
8 P. Z- c5 C7 b/ _. ^2 r
7 V) v% S1 ?8 d) T5 v2 {
public final int incrementAndGet() {! w4 Q* p( i$ Z% a. M
for (;;) {$ j7 Q+ L* v) a: d |
int current = get(); - E% [& K- ^ C. @ int next = current + 1; - [! K3 U1 `+ N- M) |/ K if (compareAndSet(current, next)) 1 n% R8 ]' ~1 ~ return next;9 }# \7 n$ o, d1 t O
} " a/ K* R. ^' K( j# A3 v9 O# L/ c } ' T5 w+ H: ^& t6 ~" x* s: d( O ; S" G/ ^0 s# T6 ]/ o; W 5 d3 v/ [! F1 N0 N1 H$ q$ w4 T8 ypublic final int decrementAndGet() { % H+ ]3 a. D- |. O, i; n7 D for (;;) {$ i7 T+ }. N. u( T
int current = get(); - o7 C. _* C6 U& Y: V6 z int next = current - 1;- V( s8 z( R2 B( B* q
if (compareAndSet(current, next)). p' `+ r$ ~0 y1 h% C" K: [$ l
return next; 7 \$ z5 P) n- C9 _& _/ F# Q } 1 j# z) {7 p, X, `( q9 K) d } - r* M1 z: R7 [# a% a8 }/ _& f z' r( a3 p! F1 f; W/ C: U
+ [! Q/ V9 P$ M9 w
public final int addAndGet(int delta) { & r h! j0 z% d7 _' o" W) @2 V for (;;) {& z7 D: S/ j. {- R% J: O' K) C% X
int current = get(); 9 A3 q) Q" X" }2 J) z int next = current + delta; ; |; g1 h; z8 B' P) O$ L if (compareAndSet(current, next)) + w9 g$ x, U8 P; E0 I return next;: O7 T4 f1 \0 e# K* Q" h! { w
}/ m6 X3 l6 V' }
}- U" U' Q A4 i. C5 v0 e
5 _7 ^3 h2 c5 o4 P+ _1 x7 I- d4 m1 |( |/ u, P$ w
public String toString() {" I1 @$ ~$ c/ S' w; A- P+ q
return Integer.toString(get());1 N+ L$ r# }) k1 i
}3 t: A) ]+ v$ T8 m0 a$ L2 r* O& I
* K( A* v% P, F" Q3 z* V% H0 ~
( ]% p, z7 g8 S. V; }8 mpublic int intValue() {% J$ U& p4 n' R8 g/ B8 K4 Y' ^
return get();# R7 G9 ]. D+ d6 m7 z/ P
} 4 _+ M p' i0 g$ l7 L' }% b5 x, h3 ?9 Q ?- t
8 X% x/ D8 h7 ]; opublic long longValue() { % L0 @6 _, Q) f* d, X return (long)get(); . a% [- n2 m/ {+ y8 p- Y }& B' @* G+ c3 k