AtomicInteger类 * s3 E# G% l5 K' P# d/ O3 p2 }6 ?1 u( ]* C
这一讲,主要讲讲AtomicInteger类,此类同样是Number的子类,同时实现 Serializable。5 w% O$ }3 |0 n) x( L
+ w4 h% \/ w$ G- i, Q重点内容 : k. ~( z4 O' r% g / w/ u8 j. v9 l% t& T: R& c属性: 8 a3 Q+ _ i' ^) v! Q- Rprivate static final Unsafe unsafe = Unsafe.getUnsafe(); 7 J7 X$ c; Z; s) [* K" Z ! W Y6 I" L; x2 e: @- @' Q" ~private static final long valueOffset; $ l: _% t: G( B7 r+ i9 J4 G1 h- s& ?4 o
private volatile int value;$ ^( p3 B1 s* v- I4 o8 g
! d" H# H! b/ ]9 Q
静态代码块: - Q/ {; x. z% b. W- E6 V( m B: Dstatic { 3 W4 ? j1 c! T H try { + a4 K* [1 r$ I/ s valueOffset = unsafe.objectFieldOffset 5 Q* G# e+ L: U (AtomicInteger.class.getDeclaredField("value"));/ r9 F" Z! h, H
} catch (Exception ex) { throw new Error(ex); }/ n. I' F6 x, E
}5 I, R: y# [7 Z' O, V% \2 s# g
--------------------- ; N5 h7 S3 I6 z4 t, x6 q构造方法" e: B b- ]3 z) R! l" m
public AtomicInteger() { : ~. s3 w+ }9 Y2 Y U6 c } V* @$ k; s; |6 _! l
( U0 g/ ?$ ]' X
public AtomicInteger(int initialValue) {% i# Z, A9 u0 Z
value = initialValue;7 p+ A8 E: p- A# ]3 h6 M6 }( k0 M
} ( I W, g2 ~. }$ E. J ! u8 A* p" i6 Z' G8 D对象方法: ' M% d4 x- W* f1 Y2 J! u- c" a public final int get() {$ V8 Q6 u- N( |$ y) z' u1 D# x, ?
return value;) f' ^& b* h' K' @9 {& h* w
} 8 |1 F# B6 g% j 8 ~4 T, c- W8 c5 l' h / N6 B. F3 D/ B# D! d- Ypublic final void set(int newValue) {5 R& f' b/ Z6 Y9 B2 Z( n/ c7 U
value = newValue;" f/ n9 s5 q$ {3 o" x
} 8 U I7 g; H! W' Q7 n ' I7 Q4 e/ r; I4 }; R2 T( K: Z% Z : |- Y5 e/ I: X/ T- j* Q: ~% Hpublic final void lazySet(int newValue) { # `% I/ w, B4 J6 E unsafe.putOrderedInt(this, valueOffset, newValue);6 p' T2 v: E' J: {; J6 O n
}9 Q* e1 p' p& Q. W" ?. o j
$ Z1 k. n! L' `/ `# P
/ E4 w6 x2 I ^; K2 Xpublic final int getAndSet(int newValue) {! B4 ]4 n, a0 Z
for (;;) {! v h p+ x* z7 ~+ N& Q6 x
int current = get(); 9 Q6 X6 s# q* s% [+ k7 H, F& o if (compareAndSet(current, newValue)) J3 P6 j/ i& U* N7 Y
return current; 9 W6 R7 Z; u" ` } 4 Z5 \8 T) v/ O) n2 B' _- T4 m* Z }9 Z% w; @9 s; Z; Y) {, Q
+ M j8 T9 K/ ?5 I6 W; O$ D5 y1 f* ~8 d
public final boolean compareAndSet(int expect, int update) { % c2 [& n* G2 l: g6 V) } return unsafe.compareAndSwapInt(this, valueOffset, expect, update);; x9 `+ N/ H) U, O: [, \) e
} & O/ D: ?! C9 m$ r5 u, y+ g& N6 L
% B; s" m4 @: ?public final boolean weakCompareAndSet(int expect, int update) { 7 K' Y% K+ L# ^8 [% y return unsafe.compareAndSwapInt(this, valueOffset, expect, update); + }, z$ J# C; m; a% |- m' B1 g6 l }- E7 w; O' y/ b3 {( f
" G4 X. w5 m( |& N8 Vpublic final int getAndIncrement() {. |& b7 D1 ^. d2 p8 ~: I, v3 x
for (;;) {" A* I9 H D7 y: D: B0 P
int current = get(); C# e9 H/ l" j1 `" ]% X" w
int next = current + 1;' @) ]4 g$ ]! ?+ S! |/ ]! s9 }. l
if (compareAndSet(current, next))' D' N, l. `) P' _
return current; % l4 E: i- Q+ ?0 ]9 \ } ; [! r" ?0 I( P- j2 R } , e: I9 p1 M. J$ c8 i* o - Z# B) ?$ _/ o4 J" _public final int getAndDecrement() { Y' D- F6 y% a+ p: J' J+ |
for (;;) {; V4 g! W/ e; Q; ^
int current = get(); ; F/ {4 C2 X/ E2 {5 m int next = current - 1;. n" g! f' _2 {3 e
if (compareAndSet(current, next))1 l: j4 s6 f6 R6 s) a5 E; p
return current;2 p8 G* R( F9 c* L. v" T
} # ~6 o4 H+ C& f: q. G, ^/ R }6 i3 M1 N$ a' W0 M1 J/ I- |
, Y- d4 H3 A) O: }4 q0 z: n9 s7 _
public final int getAndAdd(int delta) {" f9 {: f- \* t6 n" u$ w; M1 S7 B/ [
for (;;) { ; X/ F, M6 J! O int current = get();3 C1 J1 h# u* e* ]
int next = current + delta;7 g4 P( X8 n1 p5 k% q
if (compareAndSet(current, next)) ! n6 U3 z5 [) J b& [ return current;; A9 d; {1 ?+ j
} ) b, D6 \( c# i2 p, x% d$ T }# X( S6 K3 |9 |+ f) E5 r( } w
" t: k: J6 ~; v% b; e6 h0 R" d4 n$ z
3 _5 B6 F3 D# fpublic final int incrementAndGet() { . \( r! v9 t9 J9 f L" o& R for (;;) { ; L; w/ q! V* }: j$ Y$ S int current = get(); . q, x9 D2 I8 R2 B f# M7 f int next = current + 1; / @$ U/ P5 B! T3 M+ b1 l1 } if (compareAndSet(current, next)) % G' N0 J o! [7 @+ Z1 {" f/ B return next; 7 I; }, U7 m: ^, x+ Y- Q }9 m( _8 X0 _$ O' ?
} + T7 ^6 d) a% g! K. [. n. n. q; b2 [! } }7 l; G8 C$ q4 p% W2 X
5 D: p x( }, E" p) l- Ppublic final int decrementAndGet() {6 h" W- x. A' j7 O6 e: |) X+ D$ y
for (;;) { $ \' j/ r+ P' _5 X" m5 d [( p int current = get(); 3 E* z+ q$ ]% S5 L2 [! z int next = current - 1; + A; m4 h$ @0 V5 a H" l if (compareAndSet(current, next)) ~; C8 q" L+ [% T6 G
return next; * [ V5 Z. D6 r) e }5 n* Q: V [7 m+ e/ |' g
}6 c: F; F7 j* g2 @6 q- Z9 u
7 J0 J; u1 `0 I1 c0 S) d
+ T! p) M0 ~1 a: m) Q8 Rpublic final int addAndGet(int delta) { 6 \) j& C* `9 O0 o* D9 Q+ l for (;;) { 8 _8 \3 y6 T/ O int current = get();, o) B9 ^, b# M% g+ o S
int next = current + delta; + A1 v O3 ?9 @, Q5 C# m" r if (compareAndSet(current, next)) % q, w/ f0 o- s O- d return next;$ K" b" u" V3 U) g. B. s, \- H7 f
} # F" J2 g. D, v. r+ x# ]! r } ! w9 K" v; O8 }! P$ |& J. ^: C; K8 K; g* t; b
( e2 u k1 [+ c4 I; T6 c* [
public String toString() { ! j4 k! b0 p# h" r" t) ?+ D return Integer.toString(get()); ' U# t2 F; u; a6 d: Z% U3 g }9 ^' M6 x Y0 s, E# T* n0 O( V" ]
" u5 W& ~$ s: X' G& I* [. i7 Z0 V
* C' h! l! y- |5 x, ppublic int intValue() {9 c+ s* @2 N( k
return get();5 @. q6 [' s# z+ x/ ^( H
} 3 Q$ O. t7 `+ t! X0 z. i i" c/ A& u5 }$ w2 B* d) | f0 S' p; V
: ]% r' k! b0 E2 W1 B g5 f
public long longValue() { / F7 e" H' t5 R4 w$ R return (long)get();2 |+ R% Y$ T" Q. z+ A( [
}$ Y3 v$ a7 v* Q
5 p- G% C4 Z s d$ w 6 r9 U9 K; t) r" S0 V1 bpublic float floatValue() {% D- R9 c6 Q: o$ N% R
return (float)get();$ z4 ~$ p7 o/ @6 u e6 R6 F$ f8 c
}# b+ B$ ~6 V+ l5 D3 n y( \1 Z
) H v9 l" s; t. j% R2 e x
" i& Y) z- K& S6 npublic double doubleValue() { 2 d: X% N% {% y) B' Q0 P0 h/ p& s return (double)get(); 4 M C' ?- D8 {3 s, E } / I3 `+ W% S q1 h( F$ G& N--------------------- ) ^# H* M) {2 g7 d* D: T作者:feyshine 7 L0 R2 ^/ t" \; [/ X
来源:CSDN 6 p' G' F5 k0 [2 n' d! f" b
* w! X& j, N3 O& V1 A) `2 C; X: Y* I; N0 u H* k+ Y) z1 _3 m
" i! W" d# R9 |; h
1 v7 c: M( n, I$ d9 B
- `' ]- F8 ]4 o m* C