AtomicInteger类 ( h& N$ l- e8 U- @/ c7 \2 d, u0 L. [0 q) i: v1 ?
这一讲,主要讲讲AtomicInteger类,此类同样是Number的子类,同时实现 Serializable。+ R+ ?1 `3 K- k" U1 d3 A
1 s* D( C9 k' r$ B+ p8 z
重点内容" L9 Z$ k( Q6 g. V
1 j3 F' C7 d* \. K+ I属性:. u6 |1 i3 a* I; M8 I7 R. {% O: A7 O, `
private static final Unsafe unsafe = Unsafe.getUnsafe();9 Y& b# p5 O2 k3 {) p" S# T6 e* \
7 @5 F/ X* x8 T6 ]private static final long valueOffset;2 G" H% a% h4 y5 p9 |
; W0 c& i0 |! \" kprivate volatile int value; Z* Q3 m+ w2 J' R2 K% R) ~
' ?4 `9 F, x% ~6 K* ]( f) o, \
静态代码块: K0 `8 i" J, y* J* w# {. T9 ]( ustatic {0 q, I3 V1 [# n+ ^: W
try { ) l* v( A) M9 n* W; b' W valueOffset = unsafe.objectFieldOffset: {: I' D3 S4 E9 n ?8 m
(AtomicInteger.class.getDeclaredField("value")); 7 P2 C7 `' r, n5 C1 `% c } catch (Exception ex) { throw new Error(ex); } ' o5 P) @' N. R. E( {- Q- h& Y }9 r% K- _3 J* |( [
--------------------- 5 z/ G: p# O! S1 r0 P构造方法 / S' \$ y8 h1 T. q0 \+ upublic AtomicInteger() {5 @1 A: m& d; t& p% v. m
}8 X& U& D+ L3 H8 v9 P
( W8 U5 q$ D7 P+ e
public AtomicInteger(int initialValue) { 0 r$ b6 j2 t3 K# m: s& \ value = initialValue;1 e( k8 W# B! h/ }
}/ W4 |, L1 L6 G$ R5 y9 j( ]3 I
5 z& R4 B! e2 q1 G& [: f, a% ?1 |
对象方法: 6 y5 [) R4 g- ~: W! \" k4 @2 J public final int get() { # T- s1 v% j( x) Z6 z/ W return value; % f7 L0 M5 W8 w) k }- `7 v, k- X8 s% g( \
4 u: |- `9 _" \* H& ^- Z
& o% p, i7 D: {0 o6 P
public final void set(int newValue) { ' I5 f6 @& `8 ]' k0 r8 R6 r value = newValue;' C5 Y7 D9 P! `7 z, P r) u
}. K1 ^; u' `7 T9 b' W. g
& y# }2 W8 A0 T 5 A3 n: k Q4 c& J' Y' {. {public final void lazySet(int newValue) { , G5 ~4 w$ c0 U/ k; n. C unsafe.putOrderedInt(this, valueOffset, newValue);; J5 l: N' x4 Z
} 6 a/ \* |$ T6 K6 y( C) s; D P2 d4 u) w) L
$ G9 h7 `6 N5 l4 T3 t2 {! [- _4 Upublic final int getAndSet(int newValue) {, k/ k! g. G0 ^4 _2 @
for (;;) { 4 T( c3 @& N7 ~8 t3 G$ m. p int current = get();" e* s2 d( `- ]9 A4 k) ?
if (compareAndSet(current, newValue))% [2 E* B8 p4 H1 z! ]( \
return current; * }( J9 A. E+ q7 A# A0 g, z2 P% K* h& v }- u& t1 k r2 q
} ; p1 S. U7 X: f3 M- C8 E / X, [# K7 D: @3 q. e. \ 8 K% G M( {' M( `, r- dpublic final boolean compareAndSet(int expect, int update) { F, y* G! m* {/ o
return unsafe.compareAndSwapInt(this, valueOffset, expect, update); 9 l+ D6 S% [# d% h% D2 ]6 e }! [0 Z6 x* \1 w1 c4 _5 h8 F/ Q
+ g' ?6 z! L1 p0 N. e+ k
2 q9 H: U( n5 \: A( n3 [3 d2 u/ hpublic final boolean weakCompareAndSet(int expect, int update) { 9 F9 f- s @5 V* p9 P return unsafe.compareAndSwapInt(this, valueOffset, expect, update); ) L8 [( q$ v a, d } ; r8 A# M/ x% |' p' f3 G: l8 N# o" L) Q& w
public final int getAndIncrement() { 0 _! S. d" V4 P3 Q. Q for (;;) {! L9 W5 Z! f1 F, P+ p! v
int current = get();1 z3 h) u5 K+ k9 M
int next = current + 1; 8 j" G7 n/ k' L4 K if (compareAndSet(current, next))6 |8 c( ?2 a8 E
return current; 8 f, o. ?" n/ U# v } 4 H# _- Z% d: E/ Z* Y, q }7 G8 a: z* ]1 |% i# P
8 W, ^) C8 F5 I# t0 j6 r& G
public final int getAndDecrement() { 3 Z* a4 Y. F C* \8 T/ P: ?- Q: ^ for (;;) {. ~2 m4 V8 Y; I, B
int current = get(); - A/ X: s# c# b5 J/ ~ int next = current - 1;$ ^6 Z. [, k- N2 L6 I; [
if (compareAndSet(current, next)). ^$ F' c- A( ]5 E8 m/ W
return current; b; r2 j* M( K0 v) G5 h }0 o' V/ M8 q+ w, h4 U+ { Y% W
}, X: }! @6 C" e' j( e
% X% J" c0 x% i7 b: v, m2 s- t {5 t J/ ^2 `1 E
public final int getAndAdd(int delta) { ! Y3 O/ Y! i; e* |9 z for (;;) { $ `# l' P. l8 D9 a int current = get();' [: V/ f4 T, V
int next = current + delta;; ~8 ?; r/ ~/ s r. [7 e
if (compareAndSet(current, next)) / C+ @1 |5 f, P7 N8 y+ a return current; ! @2 E$ A5 D1 S( U9 P2 P* s) q) ^8 o- \ }( u: s! K& g. x0 E
} ) o1 K* h9 a- L; ?! x" G- y$ w & C1 l. d6 B0 f: } " A3 d2 P* N) ^ Bpublic final int incrementAndGet() { . c: B+ t, y2 A5 M+ n8 a0 Z for (;;) { . D. a3 A& H6 w0 C8 j- y5 b! } int current = get();% }$ X( H& R4 P3 |; e. P7 t. U Y
int next = current + 1;$ o- h9 {0 ~; G. D9 x0 s$ k
if (compareAndSet(current, next))1 |4 C9 z: w- p D/ _$ M# z2 b+ k c
return next; ~6 Z3 O, R4 `- M4 w }0 l! ^" Q$ x, @
}" C6 L4 d- [, C
6 k. ~. S& T/ u3 G/ h- v- \, k! o
public final int decrementAndGet() { ; s. N0 y- E+ |/ D) e/ D for (;;) {5 B( ? _& X5 B/ E5 w" `5 r. |
int current = get(); 5 G/ X7 d' B4 y& S* o- y2 e int next = current - 1; ! A; A( a4 p- s if (compareAndSet(current, next))0 ]$ d: o V( U0 D! S- K7 r
return next; V5 \' V7 R7 ~/ X6 j }1 u* I- d! q. @$ v
} 5 v3 \/ r7 D. [+ R# d! ?4 H, B* Q9 E6 c; e. n8 i/ F% H, b* f( J
6 f2 S* } J& |8 p( npublic final int addAndGet(int delta) { 5 I! _; |5 K$ K* | for (;;) {: Y6 h, J' s7 P& S! m
int current = get(); 5 b9 H3 c E: q6 O$ |3 P/ R+ O int next = current + delta; _! P( c1 @' o" F* X6 \) x
if (compareAndSet(current, next)) 7 E. z: b9 v: K, y' L9 f/ ?2 G& V return next;3 A. W9 ]( j+ ^, M% p- G( E
} ! F' t! ?) I2 { } : f z$ b6 D; a+ K4 g7 h5 r 4 ]. L# T4 ^2 U+ C0 J9 n. R : }2 w& i( w0 ]1 cpublic String toString() {& y8 Y% O- Y+ T( R4 F' \
return Integer.toString(get()); ^9 G% G( p) @& R1 G } * u) Y5 }1 b2 u, p. R" \0 u, K9 d* j& A4 N" K6 e: C8 t+ i. P
8 Q+ T- I. \, T( z3 |- jpublic int intValue() {( t2 K5 L# t- i+ u% a
return get(); o5 l: ^3 ]2 g& e1 c \% m; X }0 D# C5 b: t9 ?
7 o- s p9 ^8 j3 R% V1 j/ ? . b( G1 O. O# ~1 dpublic long longValue() {! f4 k4 U! x( f6 `6 Z( ]
return (long)get();2 l" N' m Q/ z* u1 h% `0 L8 {
}) H) E$ B' D5 O. C* W! s
2 g6 K) d" U+ \ 6 L8 t! Z$ W+ _ `( j0 opublic float floatValue() { 7 \' x) E+ s; F return (float)get();) v$ v4 [& n6 u4 d& U
}" P2 @" o. E( q1 l
S& ^- ~) A C% V* z
# f- A$ N: r8 w" ~public double doubleValue() {6 }2 x+ k( P1 D7 a. X
return (double)get();" j5 A V8 ^ Q: [0 Z& i- h
} 0 R1 v: u3 d3 D/ ~5 z4 |9 P- o--------------------- 1 ]# \: U0 W0 z* ?4 |1 K" C作者:feyshine ; o8 d' c ~% k0 a: u6 Z. `
来源:CSDN 9 |8 T6 k' q# _0 w, o; O* L1 W- d- ]5 X