0 |# s9 S H3 u6 B4 @5 r属性:* h& [+ X& ?3 a. H- p
private static final Unsafe unsafe = Unsafe.getUnsafe();0 ?* l) ^1 P( Q, S8 n6 |3 {
( S6 ~) g& p+ e k( a1 i4 `private static final long valueOffset;: k Q$ |. r: m Q0 j/ U, a
8 b; w) @, b. k4 Z
private volatile int value; , c; O l8 O! T7 R9 K; ?) V5 x/ ?1 L9 H" O+ X
静态代码块:7 r; ]( P H9 ^, V* |* U ~
static {$ y! F, ]+ d [ J
try { % X, H4 a/ p- N# {! b valueOffset = unsafe.objectFieldOffset 6 `/ y% D$ U" [% c2 z, ^8 a) _ (AtomicInteger.class.getDeclaredField("value"));# L' ~% {" m0 r- G& c
} catch (Exception ex) { throw new Error(ex); }0 s8 q2 m R& D z7 q9 K
} ! W% r4 e$ H! P--------------------- : b2 G8 Q$ p/ P0 j) n
构造方法 / j; }6 c+ P0 R5 N) hpublic AtomicInteger() { `2 T$ a7 j$ w3 O" p
}( O- K1 E# f3 x/ Q9 y
7 n3 {7 ^ v/ h( s* v7 M9 e$ xpublic AtomicInteger(int initialValue) {# ?" Z+ v, X E7 [. T
value = initialValue; + s* b( R/ t/ G2 a% ?7 t4 A } - w0 a3 E. C. K! \ P* n+ y$ T5 I
对象方法: $ e- \. F7 {. z f6 Y( n- m$ }" V public final int get() {, [1 V6 J6 \ |" Q
return value;0 T& T. _( H. e2 I n- b
} : H/ m9 K0 {# r" s9 e# ` ' J9 ?/ Q& h3 q. \3 R3 J6 \( E( w. O( \
public final void set(int newValue) {7 ]# R% p6 R# v G N& \3 w
value = newValue; : K% f5 j/ b N }6 Q& P) u6 R( k3 o
) l# @: E9 o7 F/ ^! Z& Y% ^ w' w! @' W- _9 {/ w- D* L
public final void lazySet(int newValue) {: X4 W+ P \& Y' r1 s4 O2 q
unsafe.putOrderedInt(this, valueOffset, newValue); " L! J' v9 _" ?- U }) V( f! W) d: |1 H/ p) i( v
% c8 J ]( E$ p- H% G- }' I' l# @3 x4 R# H% X0 v F
public final int getAndSet(int newValue) { 4 G# @' T: k5 |+ R& ^ for (;;) {! A8 y* D' L) M, c& ]: {
int current = get(); / _' c& h: t9 l: M, X if (compareAndSet(current, newValue)) / x9 h: S' e- ]: g9 ] return current;. o Q7 k$ D) L, c" ~
} ; c2 |- o6 j4 V% g1 y7 f }/ ?$ w. _, O! C6 f
G7 \8 ^9 w$ G$ D+ c- Y, @" o$ G! a3 T" r" w: P$ g
public final boolean compareAndSet(int expect, int update) {+ N- t9 [; \" g @; N3 ]9 j
return unsafe.compareAndSwapInt(this, valueOffset, expect, update); 2 R [* k8 c) f6 g } / O' m @% `& y# B! J- W3 t ( f8 \6 O% w R" V ' I2 s! S0 {8 p* g' `0 o; Z* N& w mpublic final boolean weakCompareAndSet(int expect, int update) {/ @1 e8 f6 B+ D7 k
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);* s j( {, P- ~9 |4 s( z- [
}& H5 e% d- l. b( M
6 {5 C( E+ v. ^8 mpublic final int getAndIncrement() {& \" `8 x# ~4 X5 v5 T
for (;;) {8 m& ~. d0 C: o$ R4 y
int current = get(); 7 q$ S8 `! y( x- I) E1 r: \ int next = current + 1; : h. Z) g7 O5 ?2 ~; j0 U* K3 C if (compareAndSet(current, next)) - Z7 C' g. d) n& `/ ` return current; " w; p) ^! w! H8 w3 s, |$ z( x } ! a, v+ b; w/ I! f } ( q! h7 Y# d: ]% P3 ~, O; l6 g* x% C" t: a8 a" t" j
public final int getAndDecrement() {+ n$ j4 `1 `: `
for (;;) { 7 n# e0 ^8 }& V2 ?9 o/ [1 |6 X4 s int current = get(); 1 n8 P! p4 O/ p' \& t/ G& _ int next = current - 1;1 v6 ]9 p" p, L0 K% c
if (compareAndSet(current, next)): O* t7 @ U# C( |- q# N) U
return current;! T7 S7 m7 s5 Q0 J. X5 C, x* J
}7 H/ D1 |2 s* b6 l! X
}6 T5 E0 s- h' _/ r$ T6 r# a7 a6 L
6 z* ~& ^5 V! M4 E7 J
; \1 X2 E: @" W
public final int getAndAdd(int delta) { 8 i1 R; ^* H0 U0 {2 v* {# ^5 ? for (;;) {$ Y1 \8 K" O% C% C; j5 \' a8 }
int current = get(); t* b' {# o, Q; [/ B# F int next = current + delta; ' o. b% m" ~/ p& _ if (compareAndSet(current, next)) . Z! X* }: U- \7 y% B: @ return current; b. T2 M, l9 L( H/ J# }: K }7 e5 B1 S; X; S# d8 ^3 S
}6 B* }2 |- j7 J% H7 X* f
1 x% d; R* H; T+ a2 Z1 y
2 l, f/ r7 L# n/ y( L2 X0 R
public final int incrementAndGet() { 7 _" i3 k$ g$ j. P: `9 W. H! a8 a for (;;) { 7 S) {6 j" o5 P$ F. i' C int current = get();+ o6 R) n8 P4 J& A8 P
int next = current + 1;; s& N# | n; ~* u. d' {
if (compareAndSet(current, next)) 1 p7 a. W* |7 Y# l/ K' B return next; * `3 C7 i$ n4 g! Q$ k5 y } 9 }- w2 {5 {8 I/ }& \& D }' O7 e# O6 R2 C8 l2 z& a8 t0 D
3 m7 f g, g" `; h" {7 f
3 ?. E n6 D4 O5 @8 rpublic final int decrementAndGet() {4 U) ~6 z" N2 D* z
for (;;) {2 r& A* m* p, u
int current = get();% j8 t. e [1 V+ }$ f( G
int next = current - 1; 3 A- k/ \5 c( E5 x3 W! O2 M- @ if (compareAndSet(current, next)) & L9 b, d7 o- O# P3 Y return next; 6 x) P# p, t& O0 O# E } 0 b+ h5 K% A3 F4 O+ u }7 @7 e# d; @1 s @
: x8 q7 c" a# G
* ]+ O$ |; ^+ ^) ^. C3 t6 v
public final int addAndGet(int delta) { 8 M( _, e7 r, g9 M for (;;) {9 w, J8 ~! Q& E# Y8 K
int current = get();- d7 v5 a6 b( {+ ]: {; L9 \$ K
int next = current + delta; # V/ Q4 P0 V9 P. z+ ^ if (compareAndSet(current, next))1 h) l/ n' q+ x5 O) ?; b
return next; * B6 l; {( T3 P/ l$ E } & r& _6 l- k: V. }6 j6 ]/ S: y }) V$ M, W* d5 m) U
( C5 E/ E# J, m/ I