AtomicInteger类 + p) W: w& \5 I, B ) c! C' F+ w1 m6 x这一讲,主要讲讲AtomicInteger类,此类同样是Number的子类,同时实现 Serializable。 4 W2 F: J. m2 K 5 Y5 l, V2 }& b8 \% o+ b2 M, O重点内容" Y% O6 C# R c7 o4 k) b2 @ ~
" d- l. L2 h& }; k9 E8 S" q
属性: 8 r, x' R6 D C; u$ I9 }private static final Unsafe unsafe = Unsafe.getUnsafe(); + |- s4 d C2 f+ [ ( H2 k1 a K+ ^) b ?private static final long valueOffset;4 `" z" G# t/ y# `- R! z$ C
5 L- ? S9 i3 L. t# Z- d* Hprivate volatile int value;7 @6 g" }5 L4 F. a+ I6 U9 Z. _
0 [7 e6 Q% b! i1 v$ G( T! H \静态代码块:. S+ P$ q" Q/ |- ?+ R. {
static { : Q/ `8 l# ^+ ^ p& u try { 8 e" I- `: d+ v4 V valueOffset = unsafe.objectFieldOffset- f" F% `4 Z: \* j# c* Q
(AtomicInteger.class.getDeclaredField("value")); 5 S( F5 O, h8 a' }; V% A/ t } catch (Exception ex) { throw new Error(ex); } / V2 J. n* `6 R }0 c y0 p3 P% x- L0 I4 p4 M5 T1 y
--------------------- 1 r9 V0 B' o5 M1 E& Z
构造方法 : W2 f/ ^! J+ a4 [ b. S+ p6 ~public AtomicInteger() { " L( Y% O, I$ E$ A+ F } . X: k0 }4 H |7 W0 |% D$ U$ Y4 P5 c" N( R) f
public AtomicInteger(int initialValue) {9 }, M- t ?; n2 M3 _, O! p. }
value = initialValue;7 p; [7 ~) ]: e
}9 ]3 m3 y' ]) _- @! W5 ?' u1 A, f; r0 l
$ [+ ~7 N( R2 L
对象方法: / [. U9 T% b! M) j" h$ x( M public final int get() {$ y# L& J) Y" u6 f7 \* ^
return value;6 A) s1 h0 h2 Q
}, B* R0 i n$ _
0 ]/ R, i3 D; N% ?, v
5 n* e" E5 E/ m: Fpublic final void set(int newValue) {! h8 Z z' o2 Z4 a' V6 z: [: I
value = newValue;% W! V; A' g1 c$ r: {, b
}- V8 E2 v- H9 h4 H. B
4 { D* W& @" S( J2 k
# P2 ~. d: M* d2 I5 P6 k
public final void lazySet(int newValue) { : ?/ u1 d, [; w- p unsafe.putOrderedInt(this, valueOffset, newValue); : V$ [, ?; U' x! T' b4 q }, _/ y Z$ n0 w3 n; O
z. m% e0 }2 C5 J# ^
$ Q' q+ {6 ^7 d# x6 T: fpublic final int getAndSet(int newValue) { * q# V7 H$ i+ M1 t6 B: ^ for (;;) {, w1 X7 q9 m* R) e6 v
int current = get(); ' H6 j/ b o# L0 J if (compareAndSet(current, newValue)) 5 S0 \+ p6 @% n( D3 J; D- |. ~, G return current; . S/ l: X9 x5 l5 \3 n1 b }4 f, P" R2 U. Y7 U
} + R- i M! q/ o # }1 C. N2 P4 F, T% T9 \/ V; f! n6 W
public final boolean compareAndSet(int expect, int update) { & g) }$ X( Z3 U; X& [+ j. ~8 a return unsafe.compareAndSwapInt(this, valueOffset, expect, update);( k' F" J+ |9 d6 Z- [7 S
} 7 g9 v' \* T- u) q/ C2 ^' \+ A 7 `$ Q0 b5 d5 g5 q9 B, W3 h* n' \9 N0 x2 Y0 e% f& N
public final boolean weakCompareAndSet(int expect, int update) { " ~* B% u2 t& _/ m/ D return unsafe.compareAndSwapInt(this, valueOffset, expect, update); 5 \3 ~8 U! x$ q# v( }/ ? } : L) T3 P- @$ L; z) }6 k3 L1 v1 d: d+ y2 R/ F
public final int getAndIncrement() {/ d# g+ C" r* X3 }
for (;;) {2 a; f: I5 x8 \, X( e
int current = get(); : Q+ B5 t; M/ Q& h4 {0 t1 f int next = current + 1;6 `- F+ B9 J. W( G" q& P
if (compareAndSet(current, next)) {+ k+ }$ R/ v- R return current;/ V) }0 ?9 g% U$ r' r
} ! _. ~5 E3 p7 g) ]) Q+ x }1 A1 K7 h' d* ^" e
! k: _/ Y/ R" f: V' ~2 |8 \public final int getAndDecrement() {/ j0 r4 i Z7 M
for (;;) {! i! q- g" N x; |/ D1 K3 q
int current = get();1 E/ N6 n; `: R6 f, ?$ \- J
int next = current - 1; ~' t2 R' X9 a
if (compareAndSet(current, next))3 c7 `! e- r3 |! U
return current;& L" G* A7 `! x6 d( j
}4 P1 ]: r1 u) z4 q1 b
}) P- P) a1 k& z; Q( v
# D- B' L( |, M
7 O- M" R2 {, S" _# X
public final int getAndAdd(int delta) { 0 v. k3 j( ^# C& J for (;;) {6 }$ F0 A' k* X4 [+ i
int current = get();- l7 d# t* a7 t* l) V8 v
int next = current + delta;! ?/ \* N1 j ~+ S1 H
if (compareAndSet(current, next))4 ^ S. e% w m9 j# w' n4 H* T
return current; 0 K" m$ S" r, } }5 O0 w/ ~6 I8 ^, O
}: B8 c3 _% ~/ w# a5 E
* w! [+ e8 O: L j. D# ^& w
- w% c3 Z& V9 e' @1 d
public final int incrementAndGet() { . e& `" B& d2 o L! L8 r; f for (;;) {6 m; y; Y+ s2 G: X% W
int current = get(); 6 g; P: `1 `; f- u int next = current + 1;3 F+ R3 u! C0 k0 `' n
if (compareAndSet(current, next)) ! b* G( n6 _" }5 ` return next; ( Y( l0 X( i% a2 {8 R" j } 3 t; {# N& X. I' l. k }7 {3 t1 _" \6 l% i
0 J+ w9 ?2 n0 c0 j& r
/ c& H# E$ e, e5 y
public final int decrementAndGet() { - K2 O& q. g! v2 j5 G* s, _ for (;;) {! C B' D8 ?* m) m* u+ e1 F; c
int current = get();. ?" K! N) }" }
int next = current - 1;+ V; c! Z& p+ \* Y" Q) b3 {: M
if (compareAndSet(current, next)): q2 w. u% G% z1 W8 k+ U
return next;6 V4 U! _! n( q$ J
} / ] B. F/ R F" U# V$ O8 Y } ) K2 ^" v, L6 G, B& H6 \% R 8 G0 t) Q5 H6 y3 p O( L* a9 x! A2 Y# X
public final int addAndGet(int delta) {. n9 R; g! E; x) U4 W! u5 T
for (;;) { 6 v$ f$ `/ H: b( p int current = get(); ) Q- d y' d6 n0 l int next = current + delta; + ]& D7 }$ F. k1 d; ?$ _ if (compareAndSet(current, next)) 9 k2 V o( {5 u return next;* m3 U) w, H4 ]5 I1 t0 {8 e2 P
}6 L) [! K& F( s, ^$ X; T+ h! i6 |
}+ ]; L7 t q: g" {! k9 D* \/ p8 D- j
& K2 ?7 P$ `1 R% z9 V( v8 }# ^8 H# _; g0 H( J: @
public String toString() { $ M# L: p0 N5 _$ l: O' _ return Integer.toString(get());' p/ j$ V; i: n+ R3 L1 u6 w
} $ L& ~8 `1 T2 l / p3 \8 g# z: c& V$ j8 { 5 L+ v3 G* A$ E# h( @- _4 k; upublic int intValue() {2 V% _: ?% B; ^ n
return get(); : ]) g# w* r, [# b } 6 ]" M! {: g# R1 w# i2 e& |4 Z) P4 e # o8 \/ T5 k( C/ T# [ , f0 _9 R2 o4 X" Upublic long longValue() { * S8 Y* G3 u/ M2 i return (long)get(); . f( ]" q$ B6 `* f } 6 f7 i2 \' N: Q& p }* w0 ^ E; n b5 k5 T
2 J8 N6 e8 x. r- G$ O2 _
public float floatValue() { % l$ k- R# \- S3 B0 \- ]$ l' v return (float)get();" q4 ^% V5 b6 T; H6 h& D
}. l% I9 ?6 M& H o% U
! M( h& A( i; l3 \# _/ ]# D+ F8 z. t/ l m: s
public double doubleValue() { 6 P) s5 M8 w) k# f+ F return (double)get(); / m3 j" o2 z& B } ( m" v$ b0 J# o--------------------- ( y6 u4 g5 ]3 r) w
作者:feyshine 2 G$ n! c; x+ J7 I- B
来源:CSDN 1 L" A- T! g* g# _) r
( T' X& W! m# }% [ - }0 ?: c M K. K & K6 o6 N7 }/ c, F/ E % {# q6 J8 N' H& L. k 1 F. m5 g2 W4 K& B- O [