AtomicInteger类: p' b0 w6 E" W9 k. l; k8 X. u5 `
5 ~4 N- ?/ o/ F- e$ F0 Z
这一讲,主要讲讲AtomicInteger类,此类同样是Number的子类,同时实现 Serializable。 + @- K0 Q* U# [, Q 0 ]5 ]9 g! |" e重点内容# [+ D( M$ p6 q& ~8 a( f
) ]+ E; t$ \. v
属性:: ]8 G( C4 G p& A' v9 D! d9 l
private static final Unsafe unsafe = Unsafe.getUnsafe(); # N; Z# a+ y [ 1 j0 t9 O Z: Z/ Lprivate static final long valueOffset;# O" P, {5 n4 E/ y0 _
# Y) l0 X5 u( L m( v' Q
private volatile int value;& Z& u$ M6 E$ E! O
# |8 s7 j3 G/ A- Z: q4 V% {4 a
静态代码块: 9 P+ O) O( Z9 Bstatic {$ s: F7 d- U- r( l$ Y) b& L
try { % }4 M p+ i( J# h0 Q: f( \ valueOffset = unsafe.objectFieldOffset! X3 A: d. r2 h( I' D; H
(AtomicInteger.class.getDeclaredField("value")); 2 v+ G! ]2 l, ^7 M } catch (Exception ex) { throw new Error(ex); }: o% p6 n( K5 \6 S, M
}2 R/ S2 V+ o* F* N/ T
--------------------- : T* M3 V/ D* \* ]构造方法& }& `& s" J, A& ~. D
public AtomicInteger() { ! [# `/ o- E2 G. M }- c5 r& R7 O) D& O/ s$ \9 Q- ]
. m2 |- t) v: ?* d/ P5 g
public AtomicInteger(int initialValue) { % i. w2 r, @! q; L5 d0 }5 t' J value = initialValue;, l' I4 q/ J0 e9 R4 H
} ; h0 N _$ I! w6 l. Q ! M' l" r3 c7 ~, P对象方法: 5 f* t$ v* w# n: X4 T4 e" P: K7 g public final int get() {1 r. G/ y; B, ~2 S" L) j
return value; N- J5 X/ X5 w: L+ x2 G } 2 k0 p' F R2 p- h0 {# J$ \+ i5 K# j9 ?4 p9 E
5 T- |7 Q+ k" B' cpublic final void set(int newValue) { ( z4 F+ z5 n8 O: k. p value = newValue;$ ~1 [$ C6 @ F7 q/ o0 p X. H k
}: `% Q. E& U% D2 u" |
9 X' L6 r* u/ E$ J- ^" @8 B! X# i
' R. D* O0 H. r, ~' Apublic final void lazySet(int newValue) { 7 B1 V; Z7 ^7 w* I unsafe.putOrderedInt(this, valueOffset, newValue); 9 v* S2 C. W9 |- l, x% l% t$ L" O+ f: A }# `# ?8 t2 b6 B
$ I% `* t" X' N4 z9 R 3 {) s: e0 ~; a- x/ a0 Epublic final int getAndSet(int newValue) {! D7 r4 ^: E. f6 a" A; ~
for (;;) {& l+ F1 g J" e# O% `% }# R
int current = get(); * z5 G1 y, q; N A, W if (compareAndSet(current, newValue)) ' j: u2 U" e1 J return current; $ e6 j& t1 D) Q. m: \' P5 t" A } z5 T3 \' W' m! @% ^3 x5 ]4 @; | } / S% s% I, G6 v + Y. P. x% e; G8 ?/ F9 r & E* y* F: a' V3 |! _: b+ y2 Q& _public final boolean compareAndSet(int expect, int update) { , q+ l# J/ a* {$ f- a0 j return unsafe.compareAndSwapInt(this, valueOffset, expect, update); % M% i( J) m) I$ i6 X } ( q! P; b' @$ t: ]* Z* o0 y9 W# `1 o. C
- G) F* I9 ?6 k
public final boolean weakCompareAndSet(int expect, int update) {+ O& x& J) ^, U8 ?: {8 O
return unsafe.compareAndSwapInt(this, valueOffset, expect, update); 7 A I1 v J: U6 h" x6 j } % t- i% }2 N( u" \) G0 M$ M& |) T0 J& X& z6 f L
public final int getAndIncrement() { # i0 {- T! L1 N1 `0 J- ?' d! K for (;;) {2 h: G# q3 i) J4 V# U6 p
int current = get();! Y% n; E4 |( x; N+ K5 Z2 t
int next = current + 1;( Q, b- P* W7 |, B
if (compareAndSet(current, next)) " C" G ]8 A) G2 Z- s5 S return current;$ n- q4 D/ L+ w
} $ C: b8 |6 [2 D+ ] }* w4 r; K# K7 F% f6 c6 r' P4 H
* r+ [- q+ n3 ?' L( k* tpublic final int getAndDecrement() {- X) ^8 w% a! d- B: i' |2 k
for (;;) {* Z- T4 m6 n! O, o8 y
int current = get(); * S& x( c; W( h. W, A) v; @+ } int next = current - 1; 4 n1 V8 S+ j9 d, l if (compareAndSet(current, next))$ O P8 I J( P- k- C
return current; + A- w) o, x" E } 0 `* u/ J4 c1 g/ |0 h7 i! q# l9 X+ s6 w } , J1 W3 u# {0 ^% q" r; ^: ?0 I* o+ ]$ m5 j1 p
2 }) K4 n7 F' B* ~public final int getAndAdd(int delta) { 7 r+ n" Z- r6 M4 B9 ^4 ] for (;;) { 6 j" F5 h3 \2 H- f! H- E int current = get(); + t, W. ^# o# h int next = current + delta; # g& W' m% X/ E" T. e if (compareAndSet(current, next)) # F( H' M' s( x0 Y6 a9 T, Z7 n return current; % ~, B" @# N+ |3 a9 Y } " G. Z$ ?7 y& ^! H/ w } 1 d* s6 ^4 e1 R . G- h6 N& Q: ^. u: W5 f6 }8 D. S" _
public final int incrementAndGet() { # @' U1 W; E4 ?9 h' R% I9 f for (;;) { - l, D- L( |% y+ A: l int current = get();5 t5 p; X' ?3 ?9 p
int next = current + 1;8 H! n3 V/ @8 t
if (compareAndSet(current, next)) ! [( r. ~' n1 _* q) t return next;& J! r2 j9 ?0 s) ^4 E. G- V
}/ _! @, o5 ^7 M8 E
} h1 X/ o! d. x6 [
+ g9 H$ [0 E. ~1 l$ }
/ z, u6 P& ?( y' d' [public final int decrementAndGet() { . W2 e# ` O1 e. [& |# o" \* X for (;;) { `; `" U) }5 y5 c
int current = get(); ; B, ~. J$ N4 X& a' ]3 s int next = current - 1; * T J6 ?" U9 k* B( V& K if (compareAndSet(current, next)); ?4 j% D" n0 e
return next;$ v/ D. S* _: V" _" f
} 5 h4 Q# ~2 V2 B+ n, V) G* Z }3 j0 k/ P" k, ?1 n) X1 Z
( G( g0 s" c5 h% m8 D
8 Z" [' d8 F. f, d3 Ipublic final int addAndGet(int delta) {# ^# j8 Z4 B) K: A
for (;;) {- P b/ ~9 s, E! ^2 L
int current = get(); 8 v3 ^5 Z+ e, j) W) b' A int next = current + delta; ; P2 K0 }, ?2 c5 x/ Q if (compareAndSet(current, next))6 D( c+ {1 _, ?- I. U9 E1 n
return next;' L+ d) h) u ]3 P% z
}& z) d I9 R! k" M
}7 Z' m/ i( f$ i% j! l) S/ q* C1 o
; d# ]# v# r) [% a3 T O! a 5 N" H( u& l% Wpublic String toString() {2 V+ L* g8 b$ m2 ?" U) A* Y
return Integer.toString(get()); 2 O% @* w# h- o }( N( y. q B$ _ V" n2 s/ M" M
4 s, `2 O% w" Q5 ^0 |$ f5 S6 n8 P8 z2 x, e6 b/ s# S
public int intValue() {3 B- Y' T1 j" x( x& F7 \
return get(); . ]8 |# d+ A" y1 E, R } , N3 P6 b* R& V8 D0 z4 H! B- K+ z) U$ B0 X3 i' m
~8 o( K o) ^: g3 l [0 Kpublic long longValue() {! U1 e) [% t% q. X9 ~1 U
return (long)get(); 2 [: B, g& {; f1 g: l4 l; { } 0 j7 m7 j K+ J6 I# k: h8 l2 y7 J 1 O0 z! j0 P- v% N4 f P# S4 q8 y- L2 h6 N
public float floatValue() { * k# O" P9 T0 k" G I return (float)get(); - b1 x- ^5 W9 Y. x( S( f/ W5 x. v } : _6 T1 b; ~1 w2 n+ d. [. }/ |0 L8 }( @
3 N7 A& a9 J8 h
public double doubleValue() {) v' y' w, b) j2 c/ U" X( A
return (double)get();" g; X3 P# n* g
}. Q' F/ d% D5 z" y) z R) j2 Q
--------------------- 2 x6 s/ Z0 y$ d
作者:feyshine * c" B# i/ L0 z. q' }来源:CSDN 1 Z2 V, j" D* U1 j+ W& g7 P
& K" {3 e* A5 }& P1 z" ]! e- h) V! X# l9 w: N
; t& V# ~1 B' l. U2 s0 p4 x. G3 T0 ]7 a4 E4 c2 g# S
* ]: J% |; V2 |% o$ _5 g