AtomicInteger类 7 |5 b4 M' H5 B: Y* z, J : J# V) Y0 P0 F这一讲,主要讲讲AtomicInteger类,此类同样是Number的子类,同时实现 Serializable。& D! g9 x2 Z ~
1 G2 O! W- L1 c7 F' F. c
重点内容 0 \0 r; p) j% j. D* W6 R9 H , u9 p( B* l4 J9 k1 c9 P) M; Y属性:' B( W4 I. M8 m) {8 ~
private static final Unsafe unsafe = Unsafe.getUnsafe(); 0 V/ h# ^; U5 K- o7 N* ]3 ?( s$ f: E' k" \9 P7 H0 R- Y" r# }# h
private static final long valueOffset; T3 A4 [7 i% ]/ N0 ^ y* ? 0 G8 ^" ?: q8 \2 U$ W% x u+ Nprivate volatile int value; 9 S5 _* j7 L+ k3 J3 x. ^# m, [8 U1 Z- V' v* }
静态代码块:9 x9 k/ s# ~. J. L/ u
static { # w! a% `; X, u7 M3 l0 S try { 3 k$ f7 A* v2 e1 }9 ^" v valueOffset = unsafe.objectFieldOffset , P0 X2 X, _& q9 h6 y (AtomicInteger.class.getDeclaredField("value"));8 i1 ~+ I9 ~& L& K% ^
} catch (Exception ex) { throw new Error(ex); } . |0 a3 @2 a2 [$ J+ V6 j) H% W }4 j! Y% }# s$ Y/ |' |( s
--------------------- 6 b! r( i* T- U( ^/ d构造方法 ! L% {7 T. r4 T5 mpublic AtomicInteger() { % t' u$ c, a; } S. b }6 w4 K- g2 Q0 v8 t: ?+ I" v5 E- g
/ U7 X2 Z7 Q; R, x7 @0 t
public AtomicInteger(int initialValue) { ( W6 L5 P3 H k1 p/ v/ F value = initialValue;- _4 K( ?! m5 V7 o f1 t
} - ]4 d2 ]& H8 c4 n+ P/ g# g 0 s$ y! A: {, n# ~对象方法:$ H8 A e" f3 ^; S1 T6 n& L W8 ]$ K
public final int get() {( A9 _, f$ n. Q1 I
return value;1 @( T. W3 v0 b4 F8 V' [: N+ y1 |
} + t- J- w. e. I v- y& [ / U; S! r- ?5 N6 X. Y $ j" ~) @5 w ?public final void set(int newValue) {# v. i- x" {9 Y8 w3 e
value = newValue;7 I( s) _& I: v/ v6 b1 r
} 0 ], `1 e' e9 _8 f6 Z0 \# Q, d1 m+ E8 W# {- g4 J
/ x/ t4 f" h8 G: T6 Y7 \public final void lazySet(int newValue) { $ @3 y6 A# I) S unsafe.putOrderedInt(this, valueOffset, newValue); ; V* }4 U* P, c. p3 W }! J2 T) X1 Q- Z
1 A8 _7 `; y d9 r: \ W; v, M- s2 y
public final int getAndSet(int newValue) { ! v0 ?6 K' p, h& I. \ for (;;) { , @7 a$ q# s4 L int current = get();0 _5 p5 M* }9 K
if (compareAndSet(current, newValue)) * s7 `5 V! {$ y O; ` return current; : J6 m& e6 k" L6 Q } 4 K Q+ o+ k+ ?4 f( c5 C; ?6 v } ; A+ e2 _% D v& Y, ~5 K" W& a/ U! W$ }/ F6 H
1 d P6 C: a) K; D
public final boolean compareAndSet(int expect, int update) {+ d0 q; q4 T5 t3 m% K
return unsafe.compareAndSwapInt(this, valueOffset, expect, update); 9 k, @, B* s' X }3 }; W* p, D. N
9 Y9 Z: H9 d E2 i$ e2 b4 [! } N
& d" Z8 B# ?: d' ]* |" L% z
public final boolean weakCompareAndSet(int expect, int update) {9 x8 S- {4 @# I+ w* U
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);$ m( P Z3 ~- V9 ^
} + w$ X7 u: }* }' U7 _2 y: e4 D' M; t$ v: g9 ?
public final int getAndIncrement() { 8 V" P- x) a5 o, H( F for (;;) {3 j8 |5 e9 u9 ~. c$ {% P
int current = get();9 E: A( ]" R- I
int next = current + 1;8 ]$ {, l& @! r/ Q# x& M' n0 ? I6 B
if (compareAndSet(current, next)) . C: F0 ~- ^* [$ H$ R1 J6 p) _ return current; ! W2 O% p2 K8 P3 ~ }/ p1 o, G) I6 J
} # O0 q8 F0 ~" I - }6 n+ k) |* Z' h$ U' Xpublic final int getAndDecrement() { + X! f' Y* _) k. E for (;;) { " K, S1 W6 S" i, D. B5 R int current = get(); & J/ N$ J1 Q7 I( E int next = current - 1; 8 k I' k" w% @9 G# V2 @ if (compareAndSet(current, next))' ?9 R* c, ~. V7 ~
return current;' r) ?9 ^& n' W+ r# v
}. R. s) i2 j8 {! x
} ! N8 p6 E# p) v, r# c $ }# ^8 B) f; D( o / a) w' z8 z( {* z- D! K# ]public final int getAndAdd(int delta) { : }$ d+ O( Y1 b# u4 H6 J for (;;) {4 ? A4 j# M7 E# _ ~2 p
int current = get();. H/ m: ]7 [3 [/ c6 H# u8 [
int next = current + delta;+ a4 O) t1 t, C. x
if (compareAndSet(current, next)) , C7 X1 ^: m0 E' o# C" i' Y. _0 t return current;5 C0 A) r: h) O E' v
}- O! S9 e5 t: h0 ~1 q* T6 E
}. e6 S, F' h6 ]+ G
6 _8 r+ C; U/ Q; Q4 B O4 P# x
2 c U& t% { G+ b, @2 h) Hpublic final int incrementAndGet() { 7 I7 G4 _+ _' C1 M7 u7 K- s for (;;) { 3 C6 W' E4 R! m- C int current = get();& X8 r- Q& w2 }
int next = current + 1; 3 v5 m, F2 u4 t" k, R$ A1 _) ^8 C if (compareAndSet(current, next))8 W& `- N! Z9 n# A
return next; q8 x2 R0 ?% }7 C& I2 Z# e
} 9 b) K6 P/ V% m$ t5 [, X" s2 c8 f' s% F } $ v2 z" E# w% X7 p# e0 G7 ?3 [6 H: d/ g1 |
6 o; i4 I* m" X6 z
public final int decrementAndGet() { . P _: I3 E2 `, H6 V T for (;;) { 3 R% H& A8 t' F# L. r+ D int current = get();7 p) C0 E8 L: e9 K+ ?
int next = current - 1;; i& x M% R# W7 |* }! P3 b! k8 t) c2 X
if (compareAndSet(current, next)) 4 o) B- W# b4 t return next;0 E) O' V3 i9 a( X
} 2 Q4 D$ y- U6 i$ m+ V8 Q; h }5 B( d# p$ P7 u% S4 |, e; q
, y: Y' {6 t! W: T O. |$ `$ \ ( n& B. @3 D( D- r5 g- ypublic final int addAndGet(int delta) { + O4 G) k- c8 e8 t1 S# u for (;;) { 3 a5 ]- F4 e* T3 |) o int current = get(); 5 A, c0 ]6 w# r' w. y' @ int next = current + delta; % ]: \( j7 @, f0 R& x. z if (compareAndSet(current, next)) - ~8 p8 c2 T: [0 S return next;- ]# T& @8 y" {" n" }* D3 C7 b
}4 l8 S% Y1 X* W# R
} 0 l! b+ a" |/ k; B; x* j2 [3 S7 ^0 I+ X& U# ]% u Z
9 E6 F r% G( Y! n: u( mpublic String toString() { 0 } A! F. v$ E" m& _. O! e return Integer.toString(get());- L4 l; ^# \( \" y% O' Z) n3 x
}! y% N m9 j: x- t
7 n, P: s0 J" P- q$ C( A
; P% U7 |( S) |3 `& R( I4 Xpublic int intValue() { . P" x( c# ~: }* b. d7 P- m return get();0 N& N3 K' e* e; H
}" V( G. d' s" v8 H: q
$ M- e3 I/ Y& N* b# B* | 1 r3 F9 t' l4 N. O: lpublic long longValue() { * `7 g( y; p9 d; S5 C% D return (long)get();) M" ^0 p1 W; A( t
}+ a- U7 [5 c* b9 r( Q5 K
. [4 t. U! z) u( y0 Z 2 S4 m c# m6 R! r' f+ I* mpublic float floatValue() { 6 |5 Q8 a/ o' P. W' C! y8 `3 H2 V return (float)get(); % c( h& y# N5 Y) k) p } " t9 X$ G6 s* W' A0 B5 Q/ \6 ^* | _4 Y& M& Q. ?
0 q. a% u6 ]- @7 Ypublic double doubleValue() { , r% i4 K' H0 N- L- ], {! { return (double)get(); . t4 m, p% W8 X* _ }. q$ T, `7 T4 Q, N8 c( n/ A, X
--------------------- # ?* V; f: C' \0 T& u, O, C
作者:feyshine ' r" V: X# p; w; f: y. k5 e' |来源:CSDN $ k! h/ o: W3 L F" n0 v
( |- T& q, f" D* r0 z8 b 6 n5 a" Z' S0 l4 u/ Z % [* k, D: ~& V/ `5 W/ p# L, b % T0 E7 ]& ?7 Z: W( Y8 k3 t ; |# r- S' K. q1 W