1 u! K) \" d5 F5 q" a5 X$ a. B9 J5 w属性: F; D* E+ O) u/ X. p! A5 C6 q5 T# hprivate static final Unsafe unsafe = Unsafe.getUnsafe(); ; d7 C4 i* u6 F+ T0 y 9 i* j9 C7 f3 L: ~private static final long valueOffset; b8 F5 W" o6 f
1 m7 r6 W" P" {" \$ h" l0 R1 h& T
private volatile int value; 7 Q! Y- _5 x6 V h8 F - J* H! X! o5 t! @, O" p$ x$ l静态代码块: _: L" d$ m$ ] |9 p7 z
static { . w% y/ ~6 ^2 g, {" p try {# a Y, t# P0 v% Y" }% E$ w1 l
valueOffset = unsafe.objectFieldOffset + d( s. s; q; K M (AtomicInteger.class.getDeclaredField("value"));8 U( l% d; s) }* i# U' x1 N% L
} catch (Exception ex) { throw new Error(ex); }/ Q6 ~$ v! p& p3 }+ d, W
} : W# k2 E- t9 F e/ O' ^6 Z--------------------- " m3 k) f( c5 I( J" s构造方法 / \3 a5 O: N# K" rpublic AtomicInteger() { : K3 g9 y4 Z! {2 i }+ _, @6 g$ o+ ^$ p/ m
% I% q; v2 m, a. J3 T
public AtomicInteger(int initialValue) { " t/ V% w' c% h1 a7 T2 _ value = initialValue;4 b* Q3 Q6 h: |2 a
}, h& E( q) j' y
0 K% ^6 @! A* q+ s0 z8 E% T: K
对象方法: 7 }1 S! u$ u* a+ y/ q' F+ p public final int get() { 2 y U0 M- r2 W9 G return value; $ I u) ?* D$ R3 L3 J } $ ^/ I9 }9 i" \: E' `- ?* y% C6 y/ [/ ~
7 f. k5 Q: I {% }7 O/ xpublic final void set(int newValue) { ' w& v* ]3 [+ F value = newValue; # Z6 U* `; a* X. O9 t }, g, g# I" C' a" o; q# B
! u4 r% R% b* @9 [) I : G2 z$ ~8 O' \$ Ppublic final void lazySet(int newValue) {) _' g8 q' i( [+ f( g
unsafe.putOrderedInt(this, valueOffset, newValue);8 a/ l' P' D8 K/ {+ m
}: H$ C; m& Q" M
4 T" Q$ r* M3 y; Y& q) Z+ ?5 P( R E ' p6 C [9 Z. F5 \public final int getAndSet(int newValue) {5 ~( o+ X8 W# G+ @
for (;;) {5 X8 g. H* S: o
int current = get();$ V) |' w9 I8 s0 b
if (compareAndSet(current, newValue)) # X# x& I8 V" a% S6 N* X return current;8 h" Q7 h2 H4 v! b5 H
}/ g8 t4 u4 j$ B+ ]' T
}: K) n" G) F- m$ ]" y) @6 y
8 ?/ y+ L9 `: ^/ E' @4 f
' g, y# D3 H/ F
public final boolean compareAndSet(int expect, int update) { $ B1 D8 x* v3 t7 V( y+ M4 h9 y return unsafe.compareAndSwapInt(this, valueOffset, expect, update);% F$ p3 ?2 U/ B
}8 U; o5 l3 e7 j5 n7 H8 }( s
' Z" J! M- l# g# M" x C
% U% H% [4 Z# T$ {
public final boolean weakCompareAndSet(int expect, int update) { ' E3 D: |/ A- c1 ]$ T' l. s# Y return unsafe.compareAndSwapInt(this, valueOffset, expect, update); , Q: T! ?( W5 S. T3 k: P } + L' C% \9 ~5 D. d( m: n, K; @& O! F0 S
public final int getAndIncrement() {0 X3 O( n0 {! W8 A$ J
for (;;) { / n( ^3 w7 l) i6 q8 j5 E int current = get();6 w- g8 @$ J V& _+ }/ X
int next = current + 1;2 G9 u, G) a' C% Y3 P
if (compareAndSet(current, next)) ! u6 I! n$ P6 X `1 p; \+ s" K return current;! G6 [' L7 C6 i, R n, U
}" H0 O( C; q8 q) [# C% f( x( }
}) Y5 {. q, R- m( `1 s! R3 H
# z5 E4 b ~) U# B% B: N+ [
public final int getAndDecrement() {8 H; o5 g b# g* _% s
for (;;) {$ y5 f- h7 p/ z5 H
int current = get(); + s9 J! T$ v3 m: ] int next = current - 1;: W, g( N! u: f, K, J+ E4 U
if (compareAndSet(current, next)) 2 x% i, N% f0 c) ~9 ^ j return current; o, e Q& x1 c4 H }% \" h' b+ o8 f: d: k
}+ w! O# y7 `2 P' q# A+ {) k
2 U! y7 U; Z0 D! W$ \, S$ c1 ~2 K2 ]& B " F( Y* R+ D) { epublic final int getAndAdd(int delta) { % W$ N3 {. G8 o3 n% L" M$ G; x for (;;) {# Z" L# }' a1 H* I. P
int current = get(); $ |1 N( S e, j* l, o3 a int next = current + delta; / `. i0 j/ ~1 u E8 n if (compareAndSet(current, next)) 9 o4 t8 z5 ~& q8 R! \: p return current; 7 J7 |) }& r* M5 v- H2 A# V2 [% I }0 Y( H/ q- V y/ {4 c
}- W$ m8 G7 S5 G$ P1 _. t4 ]- B' L
$ z6 [+ q/ {& |. L C9 s: f. ~* \4 A$ c& }
public final int incrementAndGet() { A, n" w, l; C) R for (;;) {( M# ^$ x; T8 h
int current = get();3 M% v' Y6 C, L3 Y- M
int next = current + 1; " c8 X- a/ P$ Y0 U if (compareAndSet(current, next)): u& c. V+ o5 t8 b
return next; - n( t! {5 s4 j- k* }/ y }4 M& R) f5 [' a. N, d, I
} , O- V; r: z' Q, C/ I2 Z! Z; C. [ : s+ r0 k+ W8 v# ?. Q0 Z6 ]$ t0 X. V ' g, L+ P h; P8 u2 V: d/ n5 tpublic final int decrementAndGet() {3 O- `. J# y" O
for (;;) {! l; o: [4 t. T Y+ f
int current = get(); 3 `4 u0 B2 l; K! z2 _ int next = current - 1; $ v1 u1 A5 v- o# e, B) \5 r$ p7 P* w if (compareAndSet(current, next)) : E. ?" N: F5 I5 Q) W return next;& z7 P5 f+ X. y2 x- G
} ; ]: o- I" ]' P- R9 w$ H }2 ?6 T, z: p8 s& w, O3 b9 A' D
# G6 i% }5 h# n" e" X' q9 b m$ U2 o9 h
public final int addAndGet(int delta) {, h5 W) F5 V8 S+ @* O' ~% c0 i( ]
for (;;) {! o, p2 {6 e% [0 S
int current = get(); 3 B. S4 t- ]$ B! G; U; s+ a int next = current + delta;/ Z2 f. B$ I) b9 m) q) q* p
if (compareAndSet(current, next))1 q5 D2 {: b) u- |
return next; " X4 `7 H) b5 `. v4 |& x } 9 L/ A) V# F3 I0 R* I }' r! r4 a. E6 n7 q7 K
9 a* @1 Q0 F7 p" q
7 H- T$ F& d4 H5 {3 O5 M5 L
public String toString() { 4 w7 L% Q' J0 ?( x6 } Q0 {% ` return Integer.toString(get()); 4 _# _' K5 P5 Q" L2 w% l } ! M. X0 [" \0 J. W( C! c- Z# T# I' I+ W) f0 y
6 U* F# j J1 e, }6 O, Kpublic int intValue() {8 h8 n' I1 c* p& y+ G& u
return get();8 R# m$ y: W, p% H
} ( Y% ^# u2 Y/ x i; X2 k4 E, h; w & v& Y$ d1 Y& X+ ?1 u / ^: S* t) Z G, @public long longValue() { j3 r9 T/ d# _
return (long)get();+ t6 W6 v# d/ I. ~ M" m; G5 i
} ) g7 s6 y8 O( {& n. d8 ?" e% D5 J- p( Q% S
. [" c: L' D! U. \2 |" P0 opublic float floatValue() { + Q8 Y6 O; D3 Z; B- J. M return (float)get(); # O0 k; {% {2 G( g5 v+ g5 O }7 ^+ n/ w8 @" U$ F& E! G" i+ F& V
3 {6 |' `1 N+ N k9 j
9 \8 I* t l/ U' e( E/ ?: D
public double doubleValue() { ' U$ ^( W! o! L% ?, @( L, W$ ~9 { return (double)get();# o6 _6 ?9 t1 K2 {) _
}" c' X3 w2 @" B: H; v' Y/ t
--------------------- & ], v8 n% k) o7 M
作者:feyshine , x/ Z" O! O5 o来源:CSDN - v9 {* ]( X8 h0 S
, K" K3 Z. D0 L$ c/ P( l2 B/ {2 o+ s9 H$ }
7 A% L8 D/ y3 ]& O- f' T