! b& {: C5 a% P1 r9 f% K: L9 h/ t3 M属性:( }- A) R9 e( I0 D3 i# q1 @- {
private static final Unsafe unsafe = Unsafe.getUnsafe(); , U6 h8 n7 X& u$ h3 F/ e w" V2 p9 E2 c5 S. ~% C
private static final long valueOffset;) d' R- S9 f z
9 D0 i- I9 B' \, x; V5 Iprivate volatile int value; * ]; b/ V4 E6 D: t/ S4 j% z9 g H% W, X d" K$ W4 D! z# ^$ s静态代码块: / U8 [6 f0 o4 Vstatic { 6 c3 O# E7 c9 Q9 a2 p' _ try { 6 H$ @( I$ s1 O4 u# Z$ [ valueOffset = unsafe.objectFieldOffset- a2 a* g1 k4 f4 G% K
(AtomicInteger.class.getDeclaredField("value")); " v; P+ E& K x } catch (Exception ex) { throw new Error(ex); } * B+ ]4 i2 q: g9 x. ~ } : g# M/ q# {: ]- V5 Y0 N5 J--------------------- k+ i3 b7 q5 i0 {
构造方法& }; y" b& f5 `; l, S) z
public AtomicInteger() { 8 C* r/ p" ]; V! p }; }+ ]- J2 b. t$ i; [* L
0 R8 u- W& f/ xpublic AtomicInteger(int initialValue) { ; O5 U2 F- t& m4 ? value = initialValue;$ |" k3 e ^0 v& P. U1 Q" O
}8 U0 N' }/ @8 @9 X) e: ?
; V, y% J; k" M/ F
对象方法: 1 O7 O/ e+ t5 ]3 I public final int get() {6 n" T$ d( C J8 T" C% o' G* w2 S
return value; ( `: L' S( P. _4 G1 Y2 O4 ~6 L }1 Y4 I" m. `6 W4 Q4 w
; }4 O4 @1 N5 ?( y
' U0 @! [. L* p3 F
public final void set(int newValue) { ) s& D! s* p3 V' b. Q6 Y6 J value = newValue;( m% d' ^( \) S
} 0 `8 {, M0 f k+ j2 O" ~+ Z6 V) ^4 _
4 a/ _1 L: z8 \0 `1 F
public final void lazySet(int newValue) {$ Y/ M+ a+ ^8 J* s
unsafe.putOrderedInt(this, valueOffset, newValue); . s! {0 _9 l: k1 \ } " u/ y8 \- F- F6 B9 ~; v0 \/ E# V7 A# C# {/ @3 t
5 k, X+ o1 U. z1 J
public final int getAndSet(int newValue) {1 l; H' _1 r) I' u( ~. q2 S
for (;;) {+ O2 i0 A& F8 i# t p: G6 f, {
int current = get();6 ?, W! @/ a# J O
if (compareAndSet(current, newValue))9 D8 S: B. P/ Z/ e4 ~
return current;/ l8 f" B2 a8 \" D
} " m' U) N6 H$ w% j }9 h+ X, _' q F3 r& Z8 o1 b7 `
' N5 M7 j2 v+ D; V" O
" D# z$ C+ O' r& G: T; S8 x8 kpublic final boolean compareAndSet(int expect, int update) { $ | f1 X5 J/ H4 C+ Y return unsafe.compareAndSwapInt(this, valueOffset, expect, update); o# x# B3 L5 a2 q/ J* N1 y0 _: y6 s( X
}% \* {# u, x1 {
: s/ M! E" L8 d# c
! [9 `4 }+ r! x" c2 @
public final boolean weakCompareAndSet(int expect, int update) { / F8 \$ v1 y% ~ return unsafe.compareAndSwapInt(this, valueOffset, expect, update);5 G' j5 F, r" F
}3 C: v: g" ?) A' h S3 y( L
- r4 v/ ?3 D0 M [9 epublic final int getAndIncrement() {' ?, R; ] s p1 T1 V1 \8 N' L6 E
for (;;) {7 }( `; e) s) M. K) D3 m
int current = get(); * h& s' T8 f. \! W8 _ int next = current + 1; $ ?6 W x; O, S. O if (compareAndSet(current, next)) 6 ]& B4 z h! @7 L0 x& j return current; ) i# {& N+ W! J. T; a$ E( [( P }4 D- G4 z" Q) d5 ~$ O0 Z
} ], N! [& j' e. Y6 A R
0 J/ X% }; M9 c% j( }+ W$ G- p! ? Ipublic final int getAndDecrement() {9 f+ P+ Z% s i9 z4 o2 K
for (;;) {# z. G3 G1 j. B6 X
int current = get(); 6 Z0 ?- p8 F2 h% B5 N* | int next = current - 1;) Q) y2 [% h9 p% _2 q) U* W
if (compareAndSet(current, next))) d E5 l7 O7 d: r. r0 M
return current; % l" P2 a0 D* t' v( M/ ^. C1 u } 4 P( Z; P0 U" K8 A5 z l }8 h( \( g" B4 Y3 \2 p# C/ R8 Y
1 B+ u( H& q9 r1 z. j( G R8 l8 D7 E% R' ?
public final int getAndAdd(int delta) {( H& T' B4 G( ` ]: j
for (;;) {2 h. c) U$ a; \' m& P; k
int current = get(); 2 I0 `+ w" ^ e0 I% s$ X" `2 O int next = current + delta; 1 u/ S( }, ^3 c# r6 t if (compareAndSet(current, next)) 0 T2 ?$ y0 @; O return current; ' e) {: Z: H6 E& A9 j9 X } 2 g+ a* A5 s& m0 d A$ J }7 \! L' O ]1 [8 o7 v, Y
* w |1 W0 o* }7 }3 I
1 U0 c, ]6 y& `5 q8 N! ]
public final int incrementAndGet() {: }% }# U; T" e+ N
for (;;) { + s" o7 O" d+ T- y: A8 H! m9 a int current = get(); U& j1 \% b4 \/ G( {, _2 T
int next = current + 1;; \' ?+ H* W/ `$ G
if (compareAndSet(current, next))$ d) n' Z) i* T/ p7 A9 c2 @
return next;' ?4 P; T/ s& o) y
} 6 n- z, Z! Q/ d } 0 _+ Y! X X2 n8 ]0 v+ G) J" i
A& @3 [' B/ H- [5 w7 Upublic final int decrementAndGet() {! i( \+ y2 \. q' \
for (;;) {8 \) z8 B& X: e- {; e
int current = get(); : E9 g2 a. P* i int next = current - 1;# D d% Z$ t' S3 G8 \& J. f
if (compareAndSet(current, next)) 3 x) d) [+ Z, b+ t return next;* m3 ?8 E. }; S% e9 f' T8 k3 {
} ; H. T: l. b7 W# [9 H } & c* [- w8 I% k" M$ v" e. b2 X" }7 Q: [! I2 k+ r# T
" b! h1 o! {- Cpublic final int addAndGet(int delta) { ! ]+ y2 [% j$ l+ E | for (;;) { " R2 M& R+ z8 ?, K int current = get(); " P2 u: b3 P. t int next = current + delta; ! ^# _6 B0 h) t4 L- W% `: z6 S+ g if (compareAndSet(current, next))9 n/ k/ @! K1 `' ?
return next; 4 T" Y4 N Y I9 A# H4 K0 j } " K- ?# w" Y6 o3 c1 [ } * \" b- \0 d" D1 ^2 l6 b& S& u7 f
4 Y _0 n- [, D R, n) o# \! m
public String toString() {! l+ }# d) g# ?* z. k
return Integer.toString(get()); 8 K9 Q+ \+ }- v# b+ p) x }2 Q* E$ x H, V6 \4 V; H0 Y5 u
8 x8 M9 W" s7 I) N! \3 S6 J) ~
2 M6 Q5 k/ e0 P/ s: x/ h
public int intValue() {" I. b# }" T4 A& a
return get(); % I: s/ F3 U# W$ J' | } c% j5 n' [ P7 X! p3 |4 _
0 D7 Y8 n ^1 S; X* `
! i4 R- [4 }) I# G; kpublic long longValue() {3 m# E# T! o% F# w& U! r( }
return (long)get();2 V: v2 p( Z5 ~( ^& ]: d
} p; j4 X9 T/ G$ a1 z0 Y: v
8 \) S0 @$ `8 q! I
* R) `! l+ b" J* W/ \
public float floatValue() {4 H/ F7 B" {' e" f5 P! m; X o
return (float)get(); / ?! k. c" G+ V: u; y+ U } 2 q" k( V; t/ |/ i3 O 3 z m4 L3 `% c3 v2 O1 a% B# |/ L0 a; I" ^" h# o; R* T
public double doubleValue() { " i& O6 K+ W; `8 U* G5 `8 y return (double)get();5 m- w+ G9 `' s% F# H$ J8 t
}) _9 Y) g* x" c' U6 H0 I
--------------------- 3 W1 D+ D& A6 \7 b" l) `4 g
作者:feyshine $ ^2 y8 q& _2 Z4 E. G来源:CSDN 9 n% E$ ]" j+ b' W1 y9 q 2 U3 s. Z8 K+ ^! ]' n% F8 I) p" C* F6 W: n( e1 v6 r1 G. ]
7 X/ S L/ ^+ ]4 |) X5 n# Y
h* W: p. I, ~, U' P$ ~; O" _& A9 @5 K8 d4 b, K2 B2 L