5 u6 x+ X6 c) ]重点内容3 C8 X+ I- K5 I: b R2 ^
( @" h1 j& Y$ K7 p/ l7 ^! }
属性: . p1 t/ y7 G- Oprivate static final Unsafe unsafe = Unsafe.getUnsafe(); ; M5 w# T; K& Z/ z* c8 Y1 `5 K7 e, ^1 M) |- h3 Y0 E) @% `
private static final long valueOffset; * \1 \/ x* Y6 u+ y# z" Z" L: q; q4 b& n$ M# k; m* l/ u
private volatile int value; # J' e2 L7 r9 t/ ]' h( ] D2 m8 d 7 ?( i+ _% s( X' X1 g* |' x静态代码块: ' I4 X2 N. x3 j& O H! |, h3 k8 ^static { 1 c5 o" D8 w5 G2 p try {' H, g% s) {! s0 r0 V+ R- c
valueOffset = unsafe.objectFieldOffset& u' g. O1 n6 O" n) ]/ k
(AtomicInteger.class.getDeclaredField("value")); : \( P7 b/ J; W7 p6 E3 W, r } catch (Exception ex) { throw new Error(ex); } 6 u0 v; |7 v5 e3 Y# ` } 1 m, B# g- |1 C2 G( Q+ U--------------------- : T* ~$ G8 w' V h6 z2 V
构造方法0 `( k! b( o% U; g7 W( R1 Q8 d
public AtomicInteger() {) w' Q/ N/ n" d' h/ L. W6 R D0 ~+ S
}4 V# l8 ^' u1 r, L9 @* a7 e
R3 s/ h3 U8 N) }7 b
public AtomicInteger(int initialValue) {6 e: l6 B* R) E( n' m- |9 n
value = initialValue;( }5 r' ?% l# ~/ G( `4 h3 W+ q
}8 i4 c6 K) d! A' N8 D" N: x
: G1 A1 _/ `% o+ i! V" v
对象方法: 5 `% ^3 B# a; @. Z& S5 P public final int get() { ) t/ c: B; D' S" x; I# c# | return value;4 Y/ ~. A9 @+ }0 R) e2 [
} & w" T2 d! w. [& N) a6 \8 K/ ^# ^' z4 J5 y2 ?( k8 q( n
6 O+ u ]: P9 t! O8 p2 ^( ^
public final void set(int newValue) { 3 n4 u* s* }8 ^! r, Z% p) o1 v value = newValue;# @* b: H5 ?$ J ?2 H8 s
}( i1 o8 u! O' x2 F
, @/ x# T6 {1 \( G
1 B5 N( E6 i9 q; Y4 B7 x# A/ `
public final void lazySet(int newValue) { . ^$ g% w+ t* r5 P7 b unsafe.putOrderedInt(this, valueOffset, newValue);7 ?, ^, x4 z) _/ R) s4 _6 p& g
} ! ^" t1 a7 }) n7 L9 m & V0 t0 m% N2 K$ `. g) [* R. A" _- U$ x
public final int getAndSet(int newValue) { : H, M; \3 i& \* O8 Q# P for (;;) {* G# N& c% o6 r( }! r- z5 W7 p
int current = get(); # w' f7 T! V8 q6 ]1 O if (compareAndSet(current, newValue))( R: n1 Y* f9 r# k! a+ C( r
return current; * i- _! f3 J$ l" J4 s* x* e+ L* x } ! m* B6 n6 v7 o }) f0 ?0 ] W9 j; e4 \
" A, T" m L4 n s- O2 V( x8 X& M) a
public final boolean compareAndSet(int expect, int update) { , n7 k+ }4 E1 o6 Q' }0 E e8 h7 I! ? return unsafe.compareAndSwapInt(this, valueOffset, expect, update);; p+ y5 Z( [ C4 @& ~- y
} & T/ T; \+ ~0 L5 ~% i' l/ I0 J2 B: X/ i2 s7 O9 j+ U0 u9 m3 X
9 Y- ]! ?+ L! [$ ]+ |9 }3 mpublic final boolean weakCompareAndSet(int expect, int update) {/ _2 E% c9 h# T7 d* k
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);# I1 c/ ]( k( p* J0 W8 F1 v
} 1 F! A% [0 U+ n+ `. o5 K& J% T- o& E- }
public final int getAndIncrement() {: q2 a9 Y! R U1 F' D$ t, _4 T
for (;;) {- \& d& G; I/ G3 b( U
int current = get();2 D7 }& \! |* G6 f t
int next = current + 1; * o" h: F3 g" |8 D if (compareAndSet(current, next)) ; ^9 `/ X4 t9 R* g- Y% X! s' m return current;9 x2 ~7 W% m% ` b+ d
}& n0 Q# t; W7 t5 s: D& g
} " _3 S/ X+ r) }# n8 h) \6 V0 d( q0 w4 i* U
public final int getAndDecrement() { J7 O6 P! X) I for (;;) { * ^, K- M6 |" Q0 S, L int current = get(); 7 U1 W1 W; a4 c int next = current - 1;! C; f* F& ~& x3 [
if (compareAndSet(current, next))/ [8 q1 c" U7 k0 k% ?. w% ?5 x0 L
return current; & v6 K! F! o; _. T9 { }) \* I2 G# F; I% k4 o! Y- \
} 4 C4 n q* H3 W* O$ h) g- A$ A* o7 R% b/ H/ M
; Z& R ^) W8 T) b
public final int getAndAdd(int delta) {, r5 P% f0 w' c* I
for (;;) {' E0 u% i8 n8 ~/ a2 h
int current = get(); 2 e0 `+ ?- g# u8 s$ e* \ int next = current + delta; V/ `1 g2 |" G# W if (compareAndSet(current, next))/ k# F h8 i- c* T. c# ^/ c
return current; 7 x, A0 x% Y1 `+ T }, v: d, b9 I4 p- {6 S
}4 q, r1 A: Y$ W# u2 x9 A" A* b9 Y
( J; x% l& S& m2 \* b( C
5 M" a6 v9 [ p3 R7 U! \, f; Kpublic final int incrementAndGet() {0 i3 c" \$ D1 K+ B* I/ r$ y
for (;;) {" d( F7 L) s G2 W
int current = get(); . Z; [& y9 y" {& ^# g& H C& d int next = current + 1;5 J! `. T5 `9 p i5 M2 Z
if (compareAndSet(current, next))7 v( ~$ t3 S7 j8 x9 e6 `
return next;5 w9 q( j) Z/ F- N6 [
}2 a; N' ]; |4 B" B% V- o
} / f4 w7 ~, p; R, w" L! s: t4 E+ ?( i
; ?2 I) H2 {5 V2 [public final int decrementAndGet() {/ |2 s3 E7 }1 d" J+ U4 e7 D
for (;;) {3 E9 I+ ~2 O8 h* r: x! F0 I
int current = get(); " M& h3 B! d$ x; ]5 J- M int next = current - 1; 7 V( Q p/ W F8 ` if (compareAndSet(current, next)) # M$ q: o7 k1 @: j return next;' _* O9 }1 t# s
}) F7 H0 y9 h' ]" b) W2 s
}9 F* Y& f) j6 M3 i& ?6 X
& t% H K* Y6 {% ~! x8 E0 [( [5 B( [: A
public final int addAndGet(int delta) {# M* A% [! }3 e9 E. h# L
for (;;) {5 `& A# L" l. p0 R* M$ P9 d
int current = get();& h$ }' ?4 K% Q$ b A! [
int next = current + delta;1 Q8 T8 z8 o* w- k& j5 Y, ]
if (compareAndSet(current, next))9 O! {# @- i2 g9 K6 b. H7 X& `
return next;' p& X* } l9 N i: m
}+ @2 n, I/ L8 X) d; n$ D
} / }, t$ C5 d$ r' w* Q" I( l: J% B# O% u& x' x! j' {, V
& r5 L5 I" U4 Z: Wpublic String toString() { ' D. M* M) A1 p8 \" F return Integer.toString(get()); 6 b5 l0 y7 e+ F9 _5 k( M: I0 h } 3 X2 a' k- x2 C 7 M+ _- {- R! Y7 Y# G( A1 u; m* z% s! C( {% x3 B" f" x& m, k
public int intValue() { & O. Q; k$ N! c return get(); 5 V) T4 ]2 m |: b3 ]: z } 3 Z" P/ ~5 A+ T- c2 J3 N3 @1 d. o) m
. G; w" ?" S3 ?; h
public long longValue() {, `/ D3 [. T% r ]8 R7 a
return (long)get(); , _8 F4 x# Q& P' q } 5 y# g5 F! j! Y/ w( p7 P 6 a- ~' s& X g8 z! T7 _& ] # O: W# e9 X1 J3 J" A3 n5 Zpublic float floatValue() {& K# l, e' {* ^6 L# A* I
return (float)get();& f' O' o! `3 E/ U
} : @/ [1 @' j, H6 A# O3 J# u+ K6 H8 @, l
* W" J) b6 Q8 y0 _
public double doubleValue() { # a1 {' s+ B% J L8 T. ^ return (double)get();, @/ N1 _2 \$ K4 d* K4 [3 @
}' G. I( Y0 W8 r/ }7 j8 D8 g
--------------------- 0 A& c7 u; M, d% i作者:feyshine 2 i0 H; u) d5 t$ H: f4 g' r* X# Q
来源:CSDN 2 J% ^. ^5 A; p0 T
/ F/ ~# q! t6 K6 |9 f B. T' C: a: M ?7 s& i
' M: ?- p% b1 x' _- w ' Q( T; N7 u1 B 3 C( B, i0 c* l8 G+ O2 J" A