AtomicInteger类 5 P2 B% G4 A9 A/ e+ {, c: m1 _8 g0 e( T
这一讲,主要讲讲AtomicInteger类,此类同样是Number的子类,同时实现 Serializable。 % ~4 X* D; c( H: D! t7 Z" g8 v& Z2 Q' I$ f; e8 l- e- O; m
重点内容" f* }0 _6 z% P Q4 z( V, ?
6 N3 p$ F9 `5 Q. L
属性:6 I, i3 D' E6 J9 f
private static final Unsafe unsafe = Unsafe.getUnsafe();( b1 ~! e* M3 q. p# T$ w+ T
! e4 o. d% x) s* ^1 iprivate static final long valueOffset;) C& k# j# h5 d1 ]; O; o- ?( G
1 a( Y# v1 `4 [. Xprivate volatile int value; ( l0 }9 ?1 S4 V/ w7 p , p2 F2 T$ w7 h静态代码块:3 D$ K' V" ~+ B: \ G- k4 W1 V
static {1 E3 x7 W) v( r% d8 M3 K: @
try {% N+ Y* y: n- ~" x" D7 s& |1 F
valueOffset = unsafe.objectFieldOffset3 S" e' z4 F" K! X
(AtomicInteger.class.getDeclaredField("value")); & l# a: V: P1 L" B; j } catch (Exception ex) { throw new Error(ex); } ) n* ~3 e% E7 t& v. B. I$ O }" _6 F# n1 R. D5 U! n, M- M1 `
--------------------- ! i* R% l' L9 M$ p
构造方法 + {6 Z5 n; e) ~& npublic AtomicInteger() {9 N, H) U: D, @: [/ u8 z; h q
}6 }( P: N0 D0 U& o! _3 ]- L/ |6 r
9 M" J0 L9 ^- h* h; J
public AtomicInteger(int initialValue) { 9 K ?6 }5 ]- Q% ?5 g1 r: }9 q value = initialValue; ( Y! ]/ j! G# a9 } } 8 ]7 j! D) K5 G# j9 e d# ^ : O ?0 [3 H* f1 [) V* z8 h对象方法: ( S, p8 K( t* S! B public final int get() { t- q$ o" M. h& f" l( m' Y) ? return value;' E! E8 X) P. U( ^
} 2 [; p# Q+ t0 R% F* { 2 N( J! ^% R# L! J 5 ]/ G/ _4 @ k" f3 r! M1 Qpublic final void set(int newValue) { ( k/ D5 R: u. s value = newValue;- R ^" T; Y$ I% [; f
} # p% ]/ w* K* i0 a" L. Z: ]. p w 4 D" m( n# _% b8 S- ~+ o0 M7 s7 r3 F8 a3 `* k% p9 F
public final void lazySet(int newValue) { / ^- p7 z* \$ c unsafe.putOrderedInt(this, valueOffset, newValue);: z: x$ g3 V3 |7 L2 U- [5 g" h
}! L2 h2 ~% i+ V1 D
8 l3 w, k+ u5 ?4 I' |, v5 S5 c: \& a+ l2 q% F( ? I( M
public final int getAndSet(int newValue) {( \) l; x5 @9 ^4 V: _* r, e
for (;;) {% R! R5 \& ^! N' B8 m
int current = get(); m: Z5 I& G: u- d" g if (compareAndSet(current, newValue)) : }4 d9 I4 C, L: k return current;/ L& ?0 X! E5 Z
}4 x/ u: H4 ^% Z
} . s$ s9 J1 U" p' B. Z w9 N" ] Z9 R% w+ D! w) p; I( l
3 T6 F4 Q" v* D$ w; I$ h
public final boolean compareAndSet(int expect, int update) { H7 {3 m- A$ M- G/ V return unsafe.compareAndSwapInt(this, valueOffset, expect, update);6 B) _- o% M3 Y" `: W+ _
} + E* _( T% a, A* w: P9 n8 v; ?& t2 w0 V9 ~2 ?, f- e% z
, @, ]5 n3 I. [4 s6 npublic final boolean weakCompareAndSet(int expect, int update) { # u( C$ |7 x( F- z; j return unsafe.compareAndSwapInt(this, valueOffset, expect, update); 3 V6 P" Y7 G" }( j } 0 D8 R2 z0 e1 B5 [$ W2 B 5 ]' x" t- p7 @" [2 q, apublic final int getAndIncrement() {9 a( a% f6 N& Z" Y* E
for (;;) { - j6 L- O; x5 e! e4 T$ h9 P8 b int current = get(); % i) |6 a! B# E) e4 [3 g3 x% q1 i/ M+ M int next = current + 1; # Z) d) @* y, V2 I' r& I, U if (compareAndSet(current, next))4 G: w! y0 G1 B+ Y4 _% o& t$ d
return current; : W) z( ?8 _% Q4 e. ^7 h1 F }+ a% E* U! g; n; w
}" e! g: s! K) ~2 O! n
, V1 w. }8 T- T, Z! ^. K5 Hpublic final int getAndDecrement() {8 X- g, H9 Z) d0 _9 p
for (;;) { | B# k6 Z$ t, y- {3 n
int current = get();- n h: }" ~* M& ?) e
int next = current - 1;) E% A* i2 V' g) k
if (compareAndSet(current, next))5 e0 o. v/ w: H) ~, Z8 m% t/ i
return current; ' Q% s; {1 X4 K1 H+ t# t: g } 2 b" F" b; D) v. y+ j- S* a2 t }8 N0 c6 P5 V8 w, n% }: X
4 J- |& Z/ ?. E, s- s5 B
# T3 e! d! \' u7 i% o& [7 K0 F2 G% J
public final int getAndAdd(int delta) { [2 L k |8 M2 I: M" J
for (;;) {5 L4 z; J6 G, N* J
int current = get(); $ _+ t, j/ v6 T; B7 w" T+ v6 W# P int next = current + delta;, f" {" R, B& x! q5 M/ f
if (compareAndSet(current, next)) + l( c, M; }, r( Q return current; 4 z2 U: u$ n- k } . n( j. l+ k) a; a }* o9 H: H( c$ E: L' W6 l8 e4 @
0 v6 _8 }/ x$ A1 k: O. {: B" w4 T% Q. x0 T, s
public final int incrementAndGet() { 3 z) B" p& |" M& o for (;;) {. q& V9 r0 O2 \, b( z
int current = get();8 U) w; x) F F7 b/ i' L/ N9 M6 f1 ?
int next = current + 1;3 q' @' E0 \" ~9 E- [ T
if (compareAndSet(current, next)) / F/ j, d4 I+ ?2 @: X3 j return next; , Q; H$ t G- [& Q2 G( ?: [ }+ ~% ?2 n& h! }8 R' A
}& G j5 M& q$ T$ D: q! A" B8 {
: M8 M$ A# d$ b7 b" j) P. {8 K
P8 Q; ?* H* g+ q( f+ T- ]public final int decrementAndGet() { * {5 t4 V9 [0 `$ d$ H9 Y9 r7 Z' j7 T O for (;;) {+ Q0 ]/ I, l* W* o
int current = get(); 4 ^! a$ F8 S) [7 @! r int next = current - 1; 0 ?. F) k: e: J if (compareAndSet(current, next)) y% Q( y+ h1 q+ `/ ?
return next; % x: T: G: E5 g) H& a# F/ N" V } 2 ^. b- a" o. @0 M9 g4 b } ' R3 M% n5 e/ Q$ k# p7 e0 _: j 7 T% h9 O D) U6 j: x: ~1 k: I 5 L3 W8 ~' w3 ]. H, {+ jpublic final int addAndGet(int delta) {/ }, P% s. I u. D. C0 I) Q
for (;;) { 8 [! n! P# C- t( i; W int current = get(); 1 C6 a# B7 F: T8 v* L4 |( _6 N int next = current + delta; % n; n; Q9 U, [+ f if (compareAndSet(current, next))1 l3 x. X9 `* n% Z9 N
return next; 7 ^% M+ h/ ]7 \ y } 9 A* j/ p3 v; R' |/ ] }- u& v" V& v( D w
1 Y# L$ w2 } \2 |5 o( i# r4 l3 d: g8 h: e3 Y- ^& m6 j7 ?
public String toString() { 5 w. v6 |8 J3 l( ~. M" W4 d return Integer.toString(get());% @( C' d5 M) m
}4 L/ S9 y8 q8 J5 p
; E% X. X& \7 \) A p% r F
; ?# L' g+ X; ]8 Ipublic int intValue() { 0 W3 q# K$ {9 Q- y$ I return get();+ P. z7 l {& |
}) g0 L4 S+ U* Q$ k `9 r J$ L8 }
+ H+ x0 L+ n6 V1 I r' i2 t# i: a* K# @# L+ j
public long longValue() { ( z, L+ o8 B- ^1 ^4 z3 h9 N9 e return (long)get();3 ] T C( H: T2 P; q
}3 n; @! u! i2 g- U8 C
* k1 e% F9 P, E0 ?
2 ?7 `) `- b0 a; H4 U
public float floatValue() { 5 a( e! d. u) s% Y) v; \+ B! r return (float)get();) M# C' S( n! Q$ `! J# [
}2 k. f% [8 d7 c1 p( M' I
$ L- N) {# j% G
& Y2 f9 y9 s+ N( p) g! v. X. Fpublic double doubleValue() { ) m- `/ W. F9 p( u- U9 O$ S8 n return (double)get(); 9 N, e4 p1 O8 E; x. a& a } ; N/ o4 W: n) |/ `0 r( r--------------------- # N" g. s2 d- T* r
作者:feyshine ; u/ `, i! D0 b* i, l% o
来源:CSDN / `4 M0 R$ C& @2 J- d
: U! C$ j* I+ c z. f- @1 ~. a$ I& C% t( H
' k2 f8 [$ S- u; c( g6 \! e
' J' n+ h f* w; ]1 u
- |4 \( n% E* z* k$ L1 Y