AtomicInteger类 9 {. z$ l( Z' H" r3 a& G; s- g + n e$ c' U) H6 o) \; A+ H这一讲,主要讲讲AtomicInteger类,此类同样是Number的子类,同时实现 Serializable。 * W0 j, b; R5 l% q0 x2 C. x0 v- U. I3 }9 c" y9 \6 M7 K1 r" i
重点内容& s6 L$ y& ~6 S! J
! F4 Y S( l( q3 B! r l7 l; x
属性:! {' @7 Q! ~* K- ]" e
private static final Unsafe unsafe = Unsafe.getUnsafe();$ @$ J# Q( R5 T* x9 h
0 J' N+ ?: M% Gprivate static final long valueOffset; ( q, W/ \5 J6 |9 H% g4 z! K. ?$ `
private volatile int value; 5 _* f, ^" J7 L1 S9 F/ {% E1 @9 Q, p- [6 P
静态代码块: . f0 i% Z# e3 u' o3 v" p5 [8 X8 k/ jstatic {$ q* C$ p' O# b1 B1 a
try {) ~$ ]' G+ t W; G9 `& j' M0 O
valueOffset = unsafe.objectFieldOffset 2 Q$ L8 Q& A! q (AtomicInteger.class.getDeclaredField("value")); 1 U8 N# u3 ~) w" M" S4 N } catch (Exception ex) { throw new Error(ex); } . D% r$ r( b* S3 z }7 m1 q9 m1 u* y
--------------------- % c5 q9 f! Z& Z+ U5 x1 j构造方法& C3 o, v0 T& C
public AtomicInteger() { 0 P" Y5 M/ k+ q" I' E }/ m! g; `. [9 _4 u5 K9 a& L
* J! \4 u6 k. e% L
public AtomicInteger(int initialValue) { ) ]- t2 q* ?1 i) w" u& q4 J1 q value = initialValue;) w; O7 p- ?& k4 b
} `' o9 S1 a7 b% c& `$ a9 P , J6 }2 w6 d, L3 G1 f对象方法: ! b- v/ y; g! q% \- F public final int get() { : G/ ]4 R: V3 i9 x$ B0 F4 r4 e return value;: U% |) n& s; C$ y {) v0 L v$ F* i
} l: G" U5 b) l+ |* r
2 L b4 e# _5 w
! D$ @/ i) E, I7 `1 F
public final void set(int newValue) {+ ?0 N3 P) s$ v( t
value = newValue; 3 e ~9 r' g3 p9 X6 k } ( M2 [4 u7 o+ }3 f, P5 t ! W* n0 |5 L5 t# |! K0 p ( k; r5 ?# x' L/ w( f2 i, Hpublic final void lazySet(int newValue) { 5 R! D! h! \$ z4 L0 B, N/ t unsafe.putOrderedInt(this, valueOffset, newValue); 0 V$ \; H9 E1 O' \' R } 9 _3 a; e. y. u6 r& q5 Y 0 E X* ~0 H+ [" x/ b: k3 a- N% C4 E7 [8 R# h8 l% ~& }% P
public final int getAndSet(int newValue) {( c# \, K7 m& F) a! Z
for (;;) {! p& P: ~4 M& ` u$ g
int current = get(); : [# ]5 P, d* D if (compareAndSet(current, newValue)) , n5 z" w( o5 J, x return current;5 s4 S; [; b# {8 A2 z( G
} 7 [. O. e$ z: e$ P }' r2 X" M; F @7 t' v
& r1 w( L! W0 H! @" h
% b+ u# n/ V' r A9 M
public final boolean compareAndSet(int expect, int update) { ( c( x9 P+ t8 Q0 T5 |3 V7 I8 x/ E return unsafe.compareAndSwapInt(this, valueOffset, expect, update);& K M; T) y4 r0 |& n
}1 ~; N4 {8 Y- l' b. x3 }) O% T
1 a- {- K/ Q7 W; x' k6 e9 V* T4 E$ ]# n H7 {) W
public final boolean weakCompareAndSet(int expect, int update) {& b# x" p3 h# Y
return unsafe.compareAndSwapInt(this, valueOffset, expect, update); 5 X2 [* S6 g3 p+ g, k5 W' `& v6 w } P- P# e, ~4 g, s 2 u- n% a+ v& r- tpublic final int getAndIncrement() {) r0 I8 G9 [1 ~
for (;;) {' a- B+ O1 P1 Y# o( o
int current = get();2 p* i6 V% j( y* d; V+ F0 P7 d
int next = current + 1;/ b/ x( h. j! F8 C
if (compareAndSet(current, next)) 9 f, I. S+ V# y7 o4 }, u9 X return current; / S H! u1 t8 ` b } * f. V- _7 z; u8 a7 f( O% g& Z& g% j4 N }/ \* l. Q8 j; s
( k! J4 v' _, }% r2 spublic final int getAndDecrement() { " W3 W, r1 t( I for (;;) {1 e' S: V/ X. h2 ]: B- E" \
int current = get(); 3 U0 }2 E0 Y) w3 p* [ int next = current - 1;- d6 c3 n6 O# C! y5 \& H; | e8 d
if (compareAndSet(current, next))3 U( ~8 P7 l. \
return current; , F$ C( h/ R% Z2 i0 p" g5 C } - l9 N. j% L7 j. A3 q9 J+ ? } & M9 a# f& M# \. U1 u/ l' O+ i$ ?5 {( Y
' y. r \& d$ b M9 spublic final int getAndAdd(int delta) { 8 X' Q. P0 r0 B: K! C+ c for (;;) {6 B& Y0 `' R# c- b R+ X$ r
int current = get(); 9 k/ g6 H9 p5 f8 g int next = current + delta;4 h# A0 S6 C* i
if (compareAndSet(current, next)) V1 g$ A" I, P7 X: }
return current;6 R r- @5 a& @/ N$ v+ W0 F
}. v Z, a$ ~& D* y6 c% z
} h4 `5 t5 i7 b. k: m ) B! v4 T ^! X, T: M+ K" C) f, O% C , P: ^0 \/ n- ]' Ipublic final int incrementAndGet() {0 t2 E' k6 g- u3 L9 Y) q# }: k
for (;;) {& H6 T* f: _/ n" }* m7 w+ a* ?
int current = get();8 D! U( h9 y: E1 x/ e- B
int next = current + 1;6 O: S9 O2 R6 V2 o( t; c5 h
if (compareAndSet(current, next)) / e+ d1 G8 j) X: U6 O4 S return next; 4 M, c6 Y8 U' _# v: T9 L0 C- G } ( t3 @0 H, @$ M8 j }7 ]- T/ D2 w2 J( E% _/ x
! m+ I! X$ l, h5 q3 ^7 w 7 g" h& j6 u. |, s8 \! V7 q0 ^public final int decrementAndGet() { : p0 D; b4 O9 Z( W, ] for (;;) {* W. T0 a* E# m3 }; |
int current = get();3 }! \6 L4 `$ x- i% _
int next = current - 1;8 e2 |6 [+ X7 j, v$ Y+ {2 E7 P* X
if (compareAndSet(current, next))3 X' J% y5 P4 }+ V
return next; 1 N" X9 X& B n8 p, w" z8 U }/ I$ y1 l. U' g8 o$ m6 V. q# p
} 9 k! f' K: \ I. [/ ~4 q" x. |& F4 \& f6 G: o
6 T! O! l7 Z6 S+ D! |" q' H
public final int addAndGet(int delta) { , s6 b6 G6 r) Y for (;;) {; W9 W6 ?) h \4 [
int current = get(); ! y) @. O8 E* m: x6 k; `$ q int next = current + delta; * { m& N% u: U* q- E' `' t' l if (compareAndSet(current, next)); H" Z" e6 h6 p# h
return next; 3 _: R2 h9 C4 }9 h. e- L X q } 2 m5 g0 J) r+ Y! y( P1 g4 q' x4 e }( g& o: }- }( g8 U1 E* D% s
" m/ c8 i' O' N+ ~: U" i. m) M ! a6 s1 r$ ?5 Gpublic String toString() { 5 @+ L- O7 o4 Q return Integer.toString(get());6 i3 P4 N, W9 `3 s* X
} , a: f* y5 U- y3 [; Z4 t 6 t. t! i0 R3 O* U+ _+ y/ h; Z2 Q6 t6 q+ Z$ n+ R8 g, o. N7 S
public int intValue() { 8 c& `7 |9 Y& ?; f: M @6 `. M return get(); 0 i; k# Y/ ?% ~. i }6 D, u# v } 7 L$ D. E5 g* y2 t. k# k" l3 X/ w9 P; S8 W: q) C( J8 q2 d. G+ z
9 `( a# H! ~' ?public long longValue() {' A" x& z, v/ n9 T# c* W. H7 j
return (long)get();5 b# t% s9 S* l# }# O, t2 t. e: N
} 9 K6 m- {( v3 s. M; n& [6 k9 U$ s& z; ] H
1 d' I0 q+ I/ w6 P+ ^
public float floatValue() {/ U1 b! [ |; R, T/ z
return (float)get(); 2 `0 u$ G/ l4 A5 x- t* O } 4 _/ }+ S4 q8 ~0 f' x# }* J 1 o- Q2 D E& Q" o1 t 0 j. r: E* O& J2 k; F8 g& o' _public double doubleValue() {+ n+ h9 \9 L Y$ V# t
return (double)get(); - ~5 S8 s- z; W& b6 j4 O$ B2 u! N1 Q9 G } 9 P+ S) B: U! d* ~- j--------------------- 8 b1 b. L( t w O o3 _3 y, c B作者:feyshine 3 v) e3 b* P+ I) K来源:CSDN 2 W, d, a1 w$ [ F) n8 Z* ?& u n/ P$ F+ h0 x5 L. l5 R* j
/ T' {9 k# i% M2 ]7 w8 f8 F9 f
. K7 {8 H \& f4 O2 }* `. T. k( f4 P9 F6 v1 U8 {- j/ [