AtomicInteger类 ; U \$ r/ s# K1 I9 V$ n ; e' p& \/ n! W* S9 P/ }这一讲,主要讲讲AtomicInteger类,此类同样是Number的子类,同时实现 Serializable。* f* f% w) p" F2 u8 ^9 b5 W
. N6 Q1 b/ y7 I8 ]7 p9 P重点内容 ' @( B; t- }: J- G3 _7 y # x" `; b; Z3 L) @: b0 ^% u* o6 d属性: 7 P$ e, T! H) _private static final Unsafe unsafe = Unsafe.getUnsafe(); ' ?& D; u8 o3 b$ I6 M! T! E1 `$ _3 B
private static final long valueOffset;& t `! q* A) z4 ~/ |- L
. c2 w% f9 K' g3 e f3 B
private volatile int value;2 O3 v/ `$ S& T. j( w0 e* K5 S
1 |0 \ m4 i5 I/ ?$ R o4 W- a) s静态代码块:: H9 V9 p w; W" Y9 e$ f3 I8 u; y
static { 3 j6 u; y y( r) x( P1 H try {5 V; h1 B+ a! V( ^* }! {1 E
valueOffset = unsafe.objectFieldOffset 7 e6 c; V' a/ T# n" i3 _ (AtomicInteger.class.getDeclaredField("value"));/ u7 {9 m) A7 E" G# @+ j1 O
} catch (Exception ex) { throw new Error(ex); } ) l' c p0 d5 }: s9 i1 [. ]7 v2 _ } ( U6 i7 Q: @7 H7 z% [, j--------------------- % ]1 m& v: h5 y+ Y! B+ k
构造方法8 i' o# D1 M3 Z' a: d6 n
public AtomicInteger() {6 A, p' P: L' m7 | ?* ~
}$ {5 l: p% Z2 ]+ w7 r: r( R
! ]; ^4 q( \( m6 }' I7 I8 g* K1 h# D: xpublic AtomicInteger(int initialValue) { 4 v7 e8 t: P6 q+ ] value = initialValue; " ^3 C1 f! @" X% G0 ~+ P. ^; ] }( S2 q8 X1 H% M& U$ ^
3 u9 T1 E( P( j
对象方法:; w9 e, M8 x+ j* `5 O9 ~# Z/ a6 E& l
public final int get() {1 Y8 i5 }. r: R- H# b. c
return value;6 ]; p( M7 Z6 S8 d
}9 M5 s4 K, o' }% d
# z) A7 D& i3 r; A& @3 A! W6 |7 N# ~# W+ W: u
public final void set(int newValue) {7 @- {, |# ]) o6 i% h
value = newValue;* s: d9 Y! H+ C( x' M" W+ {
} - f. O$ A( e+ [# `1 d3 x ' L% G8 C3 }" j w6 F* z& S* T3 X3 Z1 S6 L$ I# A) N5 w* p& G/ V
public final void lazySet(int newValue) { ! p5 v% g a7 L3 g unsafe.putOrderedInt(this, valueOffset, newValue); 1 A. l8 e9 r5 h; e% t } 2 k1 u5 R# H9 d6 p* N. a; j. f1 n9 H( Z3 _( W% U+ v0 |
( e+ O/ {7 [* e; K" x( Ppublic final int getAndSet(int newValue) {1 N& W" K1 U2 a; {6 u' o8 g
for (;;) {" d6 J( a3 ]3 O/ Q
int current = get();& }- V; F! s( {. O
if (compareAndSet(current, newValue))2 N( S2 w: a- q4 C- r1 B
return current;& f9 n3 s- Y! z3 r2 @, p4 I
} & ^' L" W- M: K' V } : ^/ N3 S# b4 @+ t1 M8 k( U- }& z/ u
/ u! ?: ~5 h% L5 L* qpublic final boolean compareAndSet(int expect, int update) { : q# S, M# z2 k return unsafe.compareAndSwapInt(this, valueOffset, expect, update);. v3 }; @0 @$ r# X, x
}% S b& i+ s' D* M; ~* y* d
: v+ o( k) W: v% F% ~
+ y$ t3 A3 j3 m
public final boolean weakCompareAndSet(int expect, int update) {9 b$ f! v4 @/ n h" W
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);& m: `/ R) S4 n: e7 X
}* J( S4 x; b g D( Q4 }. I
8 {( |- J" H) f$ u; dpublic final int getAndIncrement() { & g3 Q% Y- n& v2 J for (;;) { 3 T/ Z2 Z; e, T1 V. S int current = get();( z2 W7 Z! y& a2 K6 Q, R
int next = current + 1;0 I& }1 D' b* v* K
if (compareAndSet(current, next))' a% X3 u* G" X, Z' Z
return current; 1 q! _1 v$ X+ [ d. I } ) B, E, T% A+ d" O4 L: x3 z! h } 4 o5 p L2 ]. U" u ; N: g# C0 O% ^( Rpublic final int getAndDecrement() { & V' R9 Z/ D/ N4 a2 d for (;;) {% j$ C# O$ N2 f) n# u4 v
int current = get(); # I8 l% N( {) K9 h/ P( ]1 j | int next = current - 1; + w* v5 s$ |8 z" ~( y/ G if (compareAndSet(current, next))' Z5 A2 G* T+ ~5 k+ X( }
return current; " g- M" H0 B0 g# @" ~# D7 @ } % m8 \; }6 s- y* r* w( _9 b" `0 F0 L' i } # `1 n) V8 m Z3 C 2 i0 l( z) a& n4 |7 R) n% U+ T7 K4 Q) m- o& w. Y2 g! x/ g4 C3 `
public final int getAndAdd(int delta) { ' r" V( j: T; L. ~8 \; F for (;;) { " E8 o& P& ?7 H' w int current = get(); 5 q/ n3 u) a) k: u, v7 [/ T int next = current + delta;1 N, N/ A# |2 ~1 ]; S5 N% V( i
if (compareAndSet(current, next))- S4 h Y8 L, d. t2 p- b, F& G
return current; 6 W8 x" E- h( W# {6 V }9 V X* f+ h) p( f' x+ s1 h0 F
} ) _) a( h- W& R- A0 _9 u+ Y- E9 @6 n2 e* e8 q0 [; l, I
' A. n( x% ?' f) Dpublic final int incrementAndGet() { 4 U% s# f$ }4 U7 l for (;;) { 7 G! A) Q( I1 m) C( S1 Y int current = get(); ' m& X3 g6 ?* A2 _ Z int next = current + 1; , ~1 C) x Q& [: c2 B2 N if (compareAndSet(current, next))" y& ?3 l8 X; D: }" h
return next;; S8 Z; x, M+ W0 H% ^1 g2 g e
} / t! h+ v9 p T }' J% R1 W* I# m$ F9 c1 d2 I
b5 a1 j* ~% t4 D# p& a3 Z4 \2 [7 W
, q3 {9 Z @1 r2 K ?/ ?* j
public final int decrementAndGet() {% C8 |9 t3 @3 `+ {/ F
for (;;) { , J9 \5 m! `8 h int current = get(); ' A6 u( k' S3 r int next = current - 1;; b7 L5 e4 t$ E
if (compareAndSet(current, next)) % m% J7 ?1 J; e6 R l _ return next;& S3 r3 Y& }; F2 n$ _( ^0 {: ~
} + s- |+ c9 ?! }/ F( N% T4 @; w$ ]. o } ; s3 y p1 p5 t& F ~! E 2 \3 N$ x$ ^% F* `6 ~% Y# r2 | ; }% D; I! @1 b/ S9 wpublic final int addAndGet(int delta) { " W5 b! z) \/ o% \ for (;;) {- Z4 E. n% A( J5 \7 O
int current = get(); 8 S% Q/ t% B) h6 j int next = current + delta;$ a$ [8 Y7 Z# c8 C% m
if (compareAndSet(current, next)) " n0 C u( s# l return next; 4 w+ v* l$ Y* G* d( U& R7 }0 L } 9 H2 e' |: }* A; u4 _) { } ) s: l7 |2 F- ]& c! k/ y. X / n2 |4 `' g* F" q. ` 3 s6 v. A, b) h6 _* K! R/ O2 i, C+ z# q5 qpublic String toString() { : b: O0 T2 Y! ?+ w return Integer.toString(get());/ p, K8 K3 Q. u5 v$ t5 H
}* o2 A0 ~; C) ~* C: X6 \8 L
4 B( x6 t# o* J y2 C/ I( f5 _ 4 U# {5 u' {/ w' f9 I1 E. @public int intValue() {) N& C9 ^: R$ w- d+ u
return get(); 3 r: R6 y! k5 l }8 ~: a4 e! r5 Y. @8 n
" j" b L9 @+ h2 M. e! W2 L D |! H 1 p! {1 t7 D' \7 y) c% T6 Jpublic long longValue() {& B2 Y& B9 C' G( ?& i- t0 n- U
return (long)get();5 S- o, ~. q3 O! E! l% K
}4 F5 p& B1 F' A2 U7 S& D
) N2 F. \( r$ L( i: W* G4 d/ R
! d0 w3 `$ Y8 j3 ^: Q* Wpublic float floatValue() { 5 X; _9 u# a2 d& |& t$ |# S return (float)get(); & U2 [+ |" l, {: N } ^8 B& W6 N! x0 E6 t" a4 C * s s3 V- L: Y( h% x9 ~+ U( z0 ]8 M. D0 ]% @9 `! I8 V
public double doubleValue() {$ N* O [* q. Z1 M* I
return (double)get();! K3 r2 [: T8 _2 E
}2 V! M, @- N- Q/ U. S5 S5 I
--------------------- ' A* ?2 s! m1 r* t8 J作者:feyshine 4 i! a1 C$ D0 w3 W! P1 l/ X来源:CSDN ( c" ]% y4 W3 T0 L, c" M v
5 N3 s; Q* _' I8 }( t7 S5 Y1 O
, A" `$ f- r5 v9 ^! Q' j! G8 X' h$ f n! p5 y- w4 `7 C) i