2 R1 h ?& ?8 Y6 A这一讲,主要讲讲AtomicInteger类,此类同样是Number的子类,同时实现 Serializable。. g& O" s# X! D* B* e1 {$ S& Q1 }$ e
% g) o, m) R, F& Y$ V8 o重点内容 0 G7 w- m# M' r7 G+ n. `9 x$ a4 l4 |, n
属性:5 m7 o* N! i1 }3 a8 x6 \
private static final Unsafe unsafe = Unsafe.getUnsafe();" \- |. ?' U* |9 p }
" T. F2 _0 |+ K& Gprivate static final long valueOffset;2 n" u/ Z% h3 u* d& X
% h( B0 P, ^5 N: i) J- S
private volatile int value;# @: t; a% D5 w$ A& S0 N
; t, m' {7 H% l6 t# x静态代码块: ) ? Q; X1 N4 N8 A4 L+ [static {- w) g7 {2 a: z
try {$ y& H' K) F/ J- L- o
valueOffset = unsafe.objectFieldOffset5 ~9 o2 s$ R) V+ Z7 ^% l6 V2 B
(AtomicInteger.class.getDeclaredField("value"));' Q& Z0 Y& B" o
} catch (Exception ex) { throw new Error(ex); } ! {% v/ G* ]% P9 P' B% I8 A. A4 G } ) V' [/ l0 a( t! x0 I0 u9 m--------------------- y; U1 G( [7 G% }) C
构造方法8 S: N' i2 h6 ^3 {8 Y
public AtomicInteger() {' N/ X& f) X; o6 Q9 s
}/ L- N6 V5 T+ J6 V
# T1 N8 s8 @3 ~+ K" W4 cpublic AtomicInteger(int initialValue) { 2 A, ?5 V- n1 B; J, R value = initialValue; 2 B+ `; B" v' y8 s* A/ H1 y }7 Y$ u" l' f. v
8 X; e- @4 v) t" w. q对象方法: 6 z. [ y8 E) ^ public final int get() { g# V) d( o+ d* x+ U9 m return value;0 V( C2 V- {8 _2 X7 M
}$ l( i# F0 _3 [, K
/ g* N+ U: z7 F8 {4 d& C) o, }5 }8 f
# F' G: y% t' g" ?% }
public final void set(int newValue) { $ M$ ]- R6 ~% a value = newValue;( S' _, K ^6 N' q- r
}: j" ]- U& O+ A% i7 o/ O% F
: e4 D/ _4 f6 ]) }% O7 N* {# t; w$ p- a; u/ e f! g! i
public final void lazySet(int newValue) {/ u4 E; K+ V3 m1 g3 ~9 ~3 W
unsafe.putOrderedInt(this, valueOffset, newValue);1 \- I/ ^: c: Y/ S& |- r
}- l$ J2 Y: z+ J8 I7 J" L2 I M% @3 R
( ]1 n& m# d g/ ` |3 N 5 {1 L! x1 r/ R9 q- {8 Fpublic final int getAndSet(int newValue) {$ R3 d7 r, A7 N5 v7 J0 b ^- w
for (;;) { $ T# S5 q& v4 c7 t: V5 o int current = get();1 W: B5 [ J: ~% J7 @2 N. t9 d
if (compareAndSet(current, newValue)) % |8 c/ i9 v3 C. F2 r' w! Q6 Y3 e3 K" Y) @ return current;8 e( r" z8 S9 K' E# t
} / t6 o0 f- X2 _4 K: f- r2 N/ z }+ x2 P( h; q9 }
1 J" K1 |/ f2 y4 l' v$ o" q ! {& l1 u9 T. M$ V# upublic final boolean compareAndSet(int expect, int update) { 1 V6 t4 O2 Q* u return unsafe.compareAndSwapInt(this, valueOffset, expect, update); . {2 }. q/ `- x1 z% I# J- ? } 8 n' B' {' o1 L" c* P, t9 o1 T/ t8 ~( p# Y5 ?! q% ?
" S4 p& d1 A2 \' A, p9 m3 Z0 y1 D
public final boolean weakCompareAndSet(int expect, int update) { , P2 S, _- {9 Z7 k* N return unsafe.compareAndSwapInt(this, valueOffset, expect, update);2 N* ]3 d) j) S4 ^4 h
} ; h' S- q, }0 q& _2 `! f. y6 F" k; |& z$ P& A3 i( e# h
public final int getAndIncrement() { ; Q; b, \( _. V9 Z* D6 S' m' `# P7 t for (;;) { # V& T6 H I$ h' G4 d int current = get();& d: D C( |9 ~5 q
int next = current + 1; ( e" O7 f# R" d if (compareAndSet(current, next))6 a' q7 Q$ x$ z# U* U) i6 v
return current;' k+ _, B, s7 a
} ; \7 ~! j7 j0 o% ~ } : C% T+ j% l1 D* l G + Y) X7 R9 L0 S' a! V; ?public final int getAndDecrement() { . ^! R. x2 o! D- S for (;;) {5 q3 M! C$ o M! _
int current = get();2 S: k) R% c3 P, d" W, ?2 Y
int next = current - 1;- J" Y9 h( t) \* ?; B7 v! j
if (compareAndSet(current, next)) / n3 R% w! Q8 n2 _# v( q return current;" o, D k9 [5 z8 l4 X; Y
} , T9 D7 V2 I7 N2 A- Y# v } # y4 z1 b6 O" r- w+ T2 i' e1 o& j9 u! Z7 R# T0 t
6 _8 Z0 G# f' b( Y' Z6 S& X
public final int getAndAdd(int delta) {+ _4 s1 p! [* X: p/ E0 |! r/ Q0 X
for (;;) { ) o- n) U7 S) I8 I0 s" O. x int current = get(); % z* }( \0 Z1 y/ H int next = current + delta; $ ~' r3 x2 X: \/ I0 o0 x7 J if (compareAndSet(current, next))5 R. ~. }/ X8 }# ]' f$ i
return current;% X' Z6 n; [" d+ R/ N& a1 M0 i
}. F; `- ^4 b; y9 \ x& |
} & U, y6 h" J1 u3 i7 c; a : D8 v$ n, c; M; T# ~# w 9 ]4 G: z, H9 A6 j) K" mpublic final int incrementAndGet() {' ?& }+ u; Y. M, S$ {
for (;;) { ( h8 O; o* f; p4 N% d8 M# v int current = get(); 3 e% |: w9 @2 u* e4 d5 v int next = current + 1; * @: J5 r2 b; R( O0 E if (compareAndSet(current, next)) % v3 f+ _: d8 w! a+ K return next;9 c6 ^" k& _2 n
} " }9 W, U3 T# m% X, y }* K, y5 ^* K2 Z6 p" c+ B$ a' a* ?
' E. x+ t% d+ O5 k& g* L
: j2 l9 y2 ]/ o: k4 M- G; c
public final int decrementAndGet() { + H0 d! j1 s a) i/ s4 J7 t+ c for (;;) {/ e S$ Y0 O2 c: j7 G& t+ S
int current = get();# z* m v, h% I( C3 v7 i* T
int next = current - 1;2 u0 k4 r. p. |; O$ R$ U: r4 }
if (compareAndSet(current, next)) $ l/ V9 `. ?4 u- {* D8 y# [3 y return next;, }% U& }! Q- L8 e4 W0 R9 m& |, J% M
} $ L* ~# A& }$ @9 [ }2 }% r# j) J& r
l. z* }9 K+ @# n % K2 F4 d& y4 k$ N: b) Dpublic final int addAndGet(int delta) {$ J8 |7 b! G+ Q! B- g
for (;;) {; d" @1 j$ B3 E5 W2 b! @
int current = get();& w5 O7 t7 E/ n- v
int next = current + delta; / @; P$ ]! T3 v5 X- }* n if (compareAndSet(current, next))/ _0 \$ M8 R" D/ q/ Q7 J
return next; * R6 |" i% o7 l' s- j- ~( c } % X' `5 \: I: M } 5 g2 ~5 u0 j6 |" n6 q8 f* D% w j* X. S
. \; e/ z8 V9 G" I5 P6 g; ppublic String toString() { - A" h; S- C8 `% u* C& u& L return Integer.toString(get()); 3 i; @) r4 | H7 G8 k- U/ v7 i7 b } # m6 c/ K' D9 O0 p: D% | 9 H1 A2 Y& v8 x1 n $ I E/ _ e5 N3 Ipublic int intValue() {7 e' L) Y2 Z: J, h6 ~( y* q5 P
return get();9 \& C# @ ]+ o+ |. w- a5 T8 \9 ]9 J: j
}; j( B* Z& r: @. O* `
$ C5 o3 h% F3 g1 q
- a7 A0 b1 @* v& f2 C
public long longValue() { 6 P: W) R% x; T3 f2 [ return (long)get(); - }; G( C- X! H0 J& x }. i5 g4 T. y9 ^- P7 T4 F( z; r' y; o
* l+ O$ }" t! x W7 f9 d 2 `7 ^0 e$ ^) q7 apublic float floatValue() { K0 m0 s6 f/ S6 q8 ^ return (float)get(); / ^% Y' v# G1 U7 w } 1 w8 w7 g( ~! E- M0 F* F/ I% r' u' f2 b
! C8 ~, p1 F; ^" Z# C6 o
public double doubleValue() {( l" N9 s3 }( G6 i+ w" m3 u
return (double)get();, C& }$ K) g! m6 T
} / Z+ A) p0 A) `* b3 I--------------------- / |9 L. o+ K* K7 |, P
作者:feyshine + k0 t) s- A# i! d; O& D8 m+ ?! X
来源:CSDN , V5 s9 Q6 z# v% @0 [- W' M- G* n7 Z% {
( j3 L2 Y# q+ B8 T 2 y4 l3 `1 @/ A/ c( t) P1 Z ; |3 t0 z! N' l. F4 F 6 o6 u6 ~! a& L