AtomicInteger类 6 j: c1 k$ z4 ^) t) i' t# k6 Q" ~# ] c2 v2 w
这一讲,主要讲讲AtomicInteger类,此类同样是Number的子类,同时实现 Serializable。 . B$ q% n* |$ a3 R 4 G S/ Q& K0 V+ z; S) X" x, A重点内容+ X$ |7 F9 a' f! ~
# z( T a2 ?$ s3 b9 v( D
属性: : p& Z; J6 @5 y, \private static final Unsafe unsafe = Unsafe.getUnsafe();, o" P. a* E, a$ ]2 b8 t3 I
. v+ a4 F7 x3 ?' {& z8 r2 ?
private static final long valueOffset;' X9 x# @# d+ n1 B+ Y; x" R
; G; P M, Y% g2 [private volatile int value; 6 Z( @1 h4 s& y) H) A( ?+ [" c1 i0 P7 x
静态代码块: w0 x! h) c+ X% x |static { : B5 ?5 z5 F3 N( Q+ [1 k try { - F9 P$ A3 p2 X! ]/ H valueOffset = unsafe.objectFieldOffset I8 {4 m O. _4 O( d
(AtomicInteger.class.getDeclaredField("value")); $ ^% s3 w+ V% A c( e) e* _3 p } catch (Exception ex) { throw new Error(ex); }5 N: `6 n* o4 E5 w
}" h' F3 l4 z# X) e/ A
--------------------- 7 o. w+ n& K9 M4 x4 S% w5 C
构造方法 . u6 f B; ~+ |3 cpublic AtomicInteger() { 4 M% O3 L$ i; j1 H- @) j } 3 w1 i8 K4 l$ |! n4 Y8 Z4 ~2 C$ D+ q" i
public AtomicInteger(int initialValue) {* L, A3 l5 o z( _
value = initialValue; & y! g" a4 O* ^8 V; _ } ' R2 z4 {5 c/ t 7 J% G" T/ O3 n9 F% V/ Q6 s对象方法: : L8 h2 ]) [/ J" ^7 J public final int get() { " ?2 Z6 z. o8 ` return value; & U1 O% E8 A" W5 z! c1 ]8 y } " j8 ^- I; E- Y# R @& C) u+ e4 [3 D5 g8 Q: ?7 d
. N2 k# K' o, x' Jpublic final void set(int newValue) { * A, {9 Z; M$ d+ H ]( r& z value = newValue; : Z- T- v+ U/ R) N* ? } ( U' m* Z, O* F$ j. I! e1 w1 T% O g. a' V' J( J! x
% x6 W/ W/ b' N, Lpublic final void lazySet(int newValue) {" v5 N; D! B" W- B6 ?
unsafe.putOrderedInt(this, valueOffset, newValue);* D6 }3 D i4 _. P
}8 ], I$ u! c2 x8 k. Q. S4 |
" r* |& Q7 [" S. a- r, g$ S+ C# w3 @$ {" z9 F
public final int getAndSet(int newValue) { 0 T+ G0 @. g6 m$ l+ q for (;;) {/ c1 n$ o: E5 {7 g0 Y
int current = get();+ a$ v* t! N9 m+ A& T! ~
if (compareAndSet(current, newValue))3 a& l' Q' P A+ M8 b0 V# f7 t
return current;' D9 h) k0 P I: e: d
} 1 |, P* }. t6 D$ v* s) g# }$ n$ k } & m2 J- F; A4 A$ u' C( n8 J' \# C# l2 D7 e) z h" B2 K, k; T* l% B; [
2 Q& U: a: w+ y7 ?4 S6 t/ Kpublic final boolean compareAndSet(int expect, int update) {" s7 |" @! K1 U; ^5 W
return unsafe.compareAndSwapInt(this, valueOffset, expect, update); " _/ e! S7 b2 S" }( b% y m }9 o5 X" K3 M9 P5 s2 }
9 M. `# g3 P% Q3 f6 T3 s# {6 w" Q3 `% E3 Y7 |6 b4 D! c& i) u
public final boolean weakCompareAndSet(int expect, int update) { * t8 g5 y2 A" d5 s: t+ F2 s return unsafe.compareAndSwapInt(this, valueOffset, expect, update);9 o4 T7 y! i) M# i9 m
} % m }2 f) l9 Q \. ]: W# T7 w3 fpublic final int getAndIncrement() {) q6 {: O2 @8 r7 a5 S7 Y& p2 ]
for (;;) { + S2 g7 R& m0 v# v9 Y int current = get();+ v7 P: G( d) D$ c; @
int next = current + 1; + A4 z5 C7 v4 c if (compareAndSet(current, next))+ }% S, _& U7 V! m) M% R1 d
return current; : `( }. z! e+ f! k) y, O, J }; e: v5 r* P- |( s3 t& a* z% g& K Q
}% X1 X( v" |% K/ ?' \+ p
) d8 f5 @# j$ |$ K6 Zpublic final int getAndDecrement() { 9 O1 H& X% l' l; K for (;;) { ' x; {/ o" m! b int current = get();$ e: w# {% f$ Z& a. K, |/ |% i# G
int next = current - 1;" s" H' u! f, g# l/ z
if (compareAndSet(current, next))1 z G0 D0 B+ e- k, |$ d
return current; : O4 \, H3 L* t% |* M3 U5 i }3 k4 V/ J# f3 H$ `
}, ]5 x5 K O9 |8 ^. t- d
" P0 `. k) L8 Y+ f @5 v8 B% R( y2 W
5 r) [7 w( p& r3 Y# _! h0 T6 [9 d
public final int getAndAdd(int delta) {$ ]5 R, R. Y1 w8 e) M+ e1 u8 `
for (;;) { % K* m; ]- p; D {8 r" C0 u9 g$ m int current = get();* a1 Q8 `" k' O6 X: c1 u
int next = current + delta; d) b7 j7 e' _ if (compareAndSet(current, next)) ( i/ ]8 k" Z5 Y* }) u W return current;( P9 E5 V* q3 `3 h! k
} " \- v7 i: C5 { ^/ w } 3 B# ?3 ?$ e/ P- f3 ?2 v- i% A" a4 k2 t; s; Z* Q9 m8 M
; R- U4 z4 e' N3 x% I" t5 a
public final int incrementAndGet() {, J1 V* e7 B4 ~5 m% F: h( p
for (;;) { 3 |0 T" v2 @4 m- ^+ U% v int current = get(); 8 S& u9 ^% y& J/ \' g! Z$ i4 B2 q int next = current + 1; ) P0 ~* K* R; ?: x% [; a if (compareAndSet(current, next))- T5 c; l# _# P+ u9 U2 X* t
return next; ( w4 e8 N. t. N& b) ^, n( ?' _2 | } . o7 a; W+ _3 L5 _ }" d# ^3 E! y o0 y! U6 x
/ h# [+ ?$ X8 f P( t6 j1 ^
1 G+ C# D+ h+ D, R% H& ^public final int decrementAndGet() {/ b7 f7 t' v3 H8 f
for (;;) {2 c5 f+ a5 P9 P! r
int current = get(); - P3 }2 L: I( _ int next = current - 1;4 X: Y! X3 n3 F0 ]+ i
if (compareAndSet(current, next)) , @0 c- U" {* d S1 C" r5 I return next;- t: S7 g2 w5 `( h
} 4 P+ \' _ M# g/ u& V }9 f! a$ @) M" `- H) y" Y
% W; l9 h/ T4 o* F9 a
, Y0 f, T, e1 }& Rpublic final int addAndGet(int delta) {# J& c+ M6 W4 e: v8 D) L
for (;;) {: p( n( T! @8 R- Z
int current = get();8 B: R+ P ]+ _1 G5 H. t
int next = current + delta;% @4 ]& Q1 k9 r, d( T3 S3 N
if (compareAndSet(current, next))# r" B6 Q4 l, F: b) [% f' d7 z3 m
return next; + G9 U! x& y1 g, s2 ~ } N4 p# ~( s$ N- d w# o, s } p& F, E/ E& b y j7 t
+ V7 `1 Q6 E' C2 `1 q1 C# I& x2 }
public String toString() { 6 h c6 a0 B" ^* u return Integer.toString(get());- Q7 L9 F9 D7 ?) y s# [7 H* \
}4 \) p5 m% i1 X, n
# @) e/ Y, K' \! ^) Y" q
1 J& r6 x5 l; u7 g& q! {public int intValue() {: z9 Q4 c0 l; G
return get();/ s. q2 o; I5 Q
} 4 o. w8 L+ b4 l% J8 a * Y+ _3 J8 R: i' y2 C S, _, ?) U7 J8 E# [
public long longValue() { * q( o2 n$ w& X8 i return (long)get();+ a( ]$ ~# @! y0 \
} + L& ^$ |7 S4 E" W# H& r I- |3 K$ A+ X b
* J- @6 U; |! A- `' ?9 C. j
public float floatValue() {" b5 x# ?6 ]( K6 ~0 U3 K! r
return (float)get();/ J& e4 }- z/ ?& f$ o0 ]4 ?
}( a4 S+ I' Z5 t, g4 k0 O' @5 E) S
5 c$ E% c4 t: j% Q- W' X$ A4 u' D7 _4 h" H3 I5 C
public double doubleValue() {) N3 W( Z! g- n$ E2 f4 L) u1 {
return (double)get(); 3 S6 ?" W9 d4 ] }. {# L. g }: R
--------------------- * o: {: M! ?3 E9 y2 K& F4 C! o0 T作者:feyshine $ |& p0 F8 [( z# n, d* ^
来源:CSDN 5 L! w* x4 H. n) _0 c& Q+ F! J3 s; u- }" M4 W( X( r
; h7 l* D* H1 U) m' W, A1 S' B