AtomicInteger类 % G) ?1 J7 ?% e; w% N% d: k- I$ v+ J% C
这一讲,主要讲讲AtomicInteger类,此类同样是Number的子类,同时实现 Serializable。4 O7 Z6 L6 T3 L# m6 O, l3 y
" R( ^# C- ^3 j4 [重点内容' q( K7 ~% n! o) @; F; b2 l* o1 I( r
. P. S* ~, }+ o" Q* ? ~( t
属性:( W" _% Z; L9 C2 @2 K
private static final Unsafe unsafe = Unsafe.getUnsafe();! j' G# Z0 N5 V! z
- ~% F6 {1 o! l
private static final long valueOffset; ) a: H2 P, f% X1 c! G) p/ |5 E$ M. b2 P3 z5 b* ^9 o
private volatile int value;+ p% n% v7 W) m2 a. a( o
% z: O/ F; c9 B0 \静态代码块:5 S- J, L4 X1 A
static { . S3 Q& b& F$ ]* C( {8 H try {# Q" ]* i1 z* P
valueOffset = unsafe.objectFieldOffset / ~! k: R" H2 D# |/ F (AtomicInteger.class.getDeclaredField("value")); ; b# W6 z9 u% @( l6 o; l } catch (Exception ex) { throw new Error(ex); }1 G- d9 X& K5 |+ \
}" v4 l0 ?7 N4 h9 J: w ]! H
--------------------- : [2 w/ p: [$ N6 V, x$ i构造方法0 J$ V: z8 v) e5 B1 t% t
public AtomicInteger() {8 {! f, \+ t3 n! w/ S" ?
} & I6 U* u7 u6 m, [- \- `7 i3 t1 D- F% u1 h7 w
public AtomicInteger(int initialValue) {- i9 Q1 J; x! v+ _, J; _
value = initialValue; ; y. H8 n6 w5 ?2 N1 ?0 P6 f4 r }5 u' k* O# t% e$ C8 K3 s
: L5 H- B, l# U" A2 v2 H' G
对象方法:! z# T, _+ _ N8 k- g. t, D
public final int get() { 7 _, @/ L" X( n+ D5 Z return value;1 a# O" t4 h! C+ |: v/ j5 {# n
}/ e( Z; A8 A+ o" d
. Q) | g2 u* Y0 Z# r3 t* L & u1 \; F9 |$ ?public final void set(int newValue) { ! q: A! T7 p$ _: t: G2 _ value = newValue; 8 q5 O% e) q8 ~8 e' H3 ? }% e) s7 b$ l9 _! o6 @* k' E
) F! s# }" p& ^! H 6 r/ J/ E% \ `8 G, D. qpublic final void lazySet(int newValue) { 6 h, S( X2 C' n" j unsafe.putOrderedInt(this, valueOffset, newValue);+ ^3 f( x2 f7 j. ]5 ?- v1 g3 A: z
} $ K3 O; E8 W7 X $ X X% f( ?; e+ X" q; {5 g3 m9 {# m9 J* W& I# W7 T6 u
public final int getAndSet(int newValue) {0 z+ d7 c& d. I+ g5 R3 [) B* T
for (;;) {& M" A I+ J6 W5 N4 s+ Q6 E9 H) b
int current = get();7 T' o5 C2 z& `; `" W
if (compareAndSet(current, newValue))+ T5 @ I) p H
return current; " r3 {& s$ j' E } ( C7 E+ O' @% R7 b } ; @ E: M$ @8 y* A( n: f) g. z$ Z : r4 [9 H. `9 M. C7 f & h/ j5 g4 A4 t- p# Wpublic final boolean compareAndSet(int expect, int update) {3 P0 Q) o* V" }8 @' x
return unsafe.compareAndSwapInt(this, valueOffset, expect, update); : ^8 [& M( B; @3 k/ p* W3 [6 J0 i } 1 p" _# L7 y' Y& S4 C) c* V : B5 X9 \3 P# m4 C8 b5 j/ Z/ D+ {( S/ A. C1 h
public final boolean weakCompareAndSet(int expect, int update) {/ R' a* S: b4 @
return unsafe.compareAndSwapInt(this, valueOffset, expect, update); ; K* y+ O$ |4 K" m }& _$ A2 w2 v/ K! k
, k+ Z0 x6 \2 \& R2 ^
public final int getAndIncrement() { % T. w$ d- J+ y" [. {2 }- | for (;;) { 9 ?$ n' h: f8 K6 z8 M- k int current = get();9 N. [: w0 e5 t6 H8 y r
int next = current + 1;* n* c. ~, b) U+ b# X: e/ R
if (compareAndSet(current, next))" w8 h) X/ P/ G3 P
return current;" G7 Y. P9 }% F# j+ \2 I2 i
} 2 t, l$ ^$ {2 s6 {$ R } f3 ]( D. Q) J) n' B* K. ~9 a" @! p3 t$ a* I7 c4 K# {
public final int getAndDecrement() {" ]' j o6 u; O: q, U
for (;;) {' ~% t% v% M2 P* `
int current = get();& o6 {/ `! v6 |
int next = current - 1; ' z+ T# U& I6 p$ [7 L+ L. ? if (compareAndSet(current, next))- R x3 A {$ X$ y" t
return current;$ h3 Y$ O! S7 A% |: t/ m6 j r$ \9 x! P
} 6 Q( k8 j2 |( O g3 q5 d+ G% t }' v. v* H% j, n _
9 a! [$ y+ u4 T $ a- S& |$ d9 G/ q% K* W4 @4 Tpublic final int getAndAdd(int delta) {! ?) r% n* y1 J8 m
for (;;) { : {6 k; V" I4 Z. d' x' A int current = get(); 8 y! _( }, d" l# i int next = current + delta;" \7 v3 Y6 Q2 d( \$ ?0 l: o& |
if (compareAndSet(current, next)) - X0 i: p9 _; i1 f) ? return current;; N% u; ^, m2 y/ E, x4 j( [
}, n( j9 L$ l+ Y( c, U7 t& a" G& U
}& _' O: {& a, M3 N9 ?
- I( F$ A/ G7 p
5 | P) u! [% V, t( H) dpublic final int incrementAndGet() {1 U+ @ m0 h. v$ R% G9 D
for (;;) { " ~5 b+ o' C; t" s/ Y int current = get(); ' `0 ^1 D/ _8 ^$ Z" p) @" T7 w/ y& z int next = current + 1;1 h2 C1 L% }4 y( B& R9 F
if (compareAndSet(current, next))& z9 G$ K d3 C8 ^2 a
return next;( C Y* W P1 M) F% J! j1 F
}* }7 `' z6 z. p1 x. h. U
}1 U* |( ]- R9 z( `9 v( c; L
i: m# m2 ? k& b; u% r! U I ! v$ G; G H% P& ^: Zpublic final int decrementAndGet() { 3 {+ ~( c( F/ {& R for (;;) { . j( j( [$ I2 a& v. \+ D- U: P int current = get(); 7 Q+ k" y" |, f5 ? int next = current - 1;1 I& S8 N9 |! @# }: z! j
if (compareAndSet(current, next))7 Y7 e% s l% f7 e+ \
return next;0 h% x/ s' S I6 u! g
} 6 M1 h! G2 _' Y4 s* D" c* Z3 Y }/ J1 z4 T- |0 Z5 ]1 D8 d4 c/ }( w
( Z3 [% `& ]3 R* Y
. F! d. {( m5 ]; p: a( w2 d
public final int addAndGet(int delta) {# K$ ]! T& x+ n9 Q5 u5 v2 ~
for (;;) {! h5 }) i5 F r5 i7 s) D
int current = get();- U$ R" J0 k& Q ?- E0 Q
int next = current + delta;+ n& p' C' P/ s7 L% s4 B
if (compareAndSet(current, next))# I1 U! p N9 Q0 m
return next; 8 o$ `. Z J! A9 |% _ s) P }! _; \* ]9 z8 C4 ^
}$ K% \8 W8 D; s* u/ H% a
: v/ a+ U9 Q. u$ I3 P9 J/ M
+ L) r" s6 e" g: r
public String toString() {+ [/ E: x+ F" Y) f6 C4 l
return Integer.toString(get()); / ~) ] C: y3 A& |1 `5 v* _ } H- K9 [) w( @( q8 \
4 a1 u: P4 @3 S- t1 y4 ]& { 5 `! C4 N7 r3 [; Zpublic int intValue() { ( J* c0 a5 k# P9 ?' V% K: _9 K return get(); 2 {- y; k+ Z! n; }4 { }) I) C# C2 `7 ]
) J# @ m- j* B8 \* G
! H: l% C" k/ I- ^' w$ o) `: j' r
public long longValue() { M5 N" k9 B H* J% B$ t$ h return (long)get(); 1 ^" E) t' O3 W7 s }$ F D u0 F/ g2 Y: D
6 F+ v* p& [$ o! x
' v' n( N0 I& e% @6 F
public float floatValue() {0 a& [% V, ^" E* i8 Q5 ^
return (float)get(); ! O; s6 M' t! Z$ [ }+ s/ X3 n$ ~, S$ U7 j8 b. h
$ z8 T( E7 H! z& [6 s4 q
; x) x2 S) D9 h8 ]' j& ]
public double doubleValue() {" ]) X9 i9 g0 T( E# r
return (double)get(); $ ?6 {' c+ g+ H" @" s7 p6 m) _ }7 ?. |0 P7 c. G+ Z1 \9 z- {
--------------------- ! K+ J) Y" Q( o; H- ]
作者:feyshine 4 k4 N+ d! D0 I来源:CSDN 7 L1 W4 \+ \) O$ j. T2 p! M! _5 ?8 [* B. j- |( v
9 v8 K& ?0 A1 `) z, s- ?" k* A% w3 v& q9 ^
8 n+ N1 D, _9 m5 O5 J1 B8 ^6 b' r9 o. J5 J3 p; x. E6 f