1 K2 `2 S- V+ X4 Y; O/ h' K' N这一讲,主要讲讲AtomicInteger类,此类同样是Number的子类,同时实现 Serializable。; A, x, Z M; S' G4 K5 H7 q
2 c% @! w5 T9 Y5 h* v ?重点内容 : f, p% I/ w8 T+ _' w5 E6 Y4 e* A) r* w
属性: 0 B+ Y8 u H* Wprivate static final Unsafe unsafe = Unsafe.getUnsafe();: ]( u( @5 E- ?" [
7 ^5 R% R1 Y) `# X! S( I
private static final long valueOffset; ! {) ~: `4 m; r: G( h# S0 G$ k1 d' F/ G
private volatile int value; 7 t8 y! D- s" K: o" c/ D ! Z/ h* A# _) Z5 ^' o) J静态代码块:9 K6 V3 n5 W5 d1 _
static { % K7 V- |. _ Q! J/ L0 F8 O8 | try {% D+ d2 a- [) j& u
valueOffset = unsafe.objectFieldOffset : i! h1 X( i3 K (AtomicInteger.class.getDeclaredField("value")); ! h% K1 m! [- j6 f, V } catch (Exception ex) { throw new Error(ex); }- E5 ]& x: {8 e4 t" Z
} " |) C- P% T! L; b4 `--------------------- # a h- o* z* t
构造方法) o. ]4 F+ z9 [8 o5 j$ h. k- H" B
public AtomicInteger() { 3 _- u6 `4 z8 Y6 q: A" A7 J }- f& G$ x) ?8 B* x# v/ G: ?
; X( p# x. h8 X3 J% B2 q
public AtomicInteger(int initialValue) { - e- A% M8 j9 e2 o( P' ^ value = initialValue;4 g( z8 g* O: y) X" w9 S& z( }
}3 m; O# H: J( N) V, X- Y) X
/ O+ v5 u' M5 _- \* `5 d
对象方法:' J! a. n$ b8 v4 E" o
public final int get() {5 z. @& n. q9 U; P9 _" w* Z+ p1 J
return value;/ L# m$ i5 J( D. ~/ ]2 T* m; [# K
}0 v9 g' q: m5 k; Q' G" i
; P# s0 T, W$ a, b& S' B $ P& j# l. l# i! x) fpublic final void set(int newValue) { v( s: x) V$ S
value = newValue; + B0 w2 B1 U5 {/ m } 4 B9 [$ S( d+ g! [7 o 5 f7 H# N' _5 m9 [2 n+ D( U" L8 z2 Z9 R6 n! v
public final void lazySet(int newValue) { ' v- A1 F9 v% F# L+ g# m' ? unsafe.putOrderedInt(this, valueOffset, newValue);( C. P7 [3 Y2 P) S7 P
}7 ~4 y/ c# f7 k0 y1 t9 G. [
/ r4 F) ^6 }1 V( X+ M1 B
- q- v! i8 s+ X/ Y4 vpublic final int getAndSet(int newValue) {& g; f! R: |0 E# G
for (;;) { : a. n! I7 I z0 i7 H int current = get(); 4 R8 ?) k a3 r! z if (compareAndSet(current, newValue)) 1 r L( b; p1 J/ F) ]0 k( M return current; 7 i, T+ K; N; o2 A( Z }0 M! [; x1 | x+ L3 \* h5 W
}. A* N; q- x: \# o
; e# e4 W+ ]* h: ~: a* a" z
& z7 j7 a" c5 Q3 W
public final boolean compareAndSet(int expect, int update) {- A* O+ O# k: h6 z+ t4 L8 ^% D1 p
return unsafe.compareAndSwapInt(this, valueOffset, expect, update); ! v6 z9 D4 S1 l: J6 w1 o6 V c }2 S6 ^( C) F! f6 s0 ^
0 k2 c; w1 l# n5 B
+ v, Q- _' `3 T* e% o
public final boolean weakCompareAndSet(int expect, int update) { & B& v# j- H9 s7 r! g: {! n return unsafe.compareAndSwapInt(this, valueOffset, expect, update);/ E" i! ^- |' b
} : v* b# K% s8 Y" q$ v n 5 @( _1 T0 S1 f: `7 p& _2 Qpublic final int getAndIncrement() {, `) P2 y4 W5 p2 o: a
for (;;) { $ e" j: V* W; B4 ]& O) k int current = get();& m9 n6 `6 m _# Q
int next = current + 1;: ^% B4 K8 q; o7 D R- M; L" p% r$ J
if (compareAndSet(current, next))' A! U% Y! X- ?
return current;2 t4 s! o. B$ O2 }
}( g8 y( S) a" n* @: j, G' M
}# y9 L0 F# {2 z+ G/ C* h
6 _/ R+ q9 K4 _5 Npublic final int getAndDecrement() { ! f9 K$ v B9 r- T for (;;) { / k+ p- m( `9 M$ v9 l int current = get(); / e7 `" e; ]! y$ v% w int next = current - 1;% d- t- `" f2 t6 S
if (compareAndSet(current, next)) & V$ I' f* s! l( ^5 g2 R2 p' K' n return current; - t2 k) @& ~6 f1 a6 {( }. @ }1 x, }- r/ N4 k3 n" H5 N
}( A' k& L! P* \. h2 V6 Q0 z
& W, t& ^' i! q2 r$ z4 u: I & w S8 M+ S2 f6 hpublic final int getAndAdd(int delta) {& u7 C6 u! o9 t" P8 q. \
for (;;) { b. m% b" U( O4 p& ^/ d1 k int current = get();; a' a; I; R3 _" W
int next = current + delta; 2 E+ W, m" q3 c5 q( f if (compareAndSet(current, next)) # G$ e4 s" y) P* J4 l* [ return current; . }! H: q2 y% } }, E& `7 l9 F/ x) F0 g7 Q7 e# {- r, v2 j
}6 Q1 j$ \# \- `2 g9 E4 ^
, R) l( Z$ G8 y' t$ v 9 v: C: T( K# U) T! W& upublic final int incrementAndGet() {4 V: i p! t6 _& n* D
for (;;) {" e+ |- ?, `6 Z9 ]' Y
int current = get();, m9 ?6 R, l7 R! A3 \$ J
int next = current + 1; % k2 F( k2 p, j9 S/ _! ? if (compareAndSet(current, next)) 4 h- @% X' o; S4 n return next; Q2 T* L% D/ M; U% Q/ x$ w } ' i0 Q( Z' \0 ]/ N8 }" I9 N } O: U" y$ ]$ j# ?) ^ & X% w+ C, J# |1 j" e% }# s" ~ 0 q- R0 U( w$ X9 ~. {- b- cpublic final int decrementAndGet() {7 N, V5 c+ ?- u) K8 b
for (;;) { 1 @! p% U3 I! @1 r int current = get();/ n3 V& S5 M$ Q! }
int next = current - 1;7 T: V& c* C+ t" v- _) V7 r* g: x
if (compareAndSet(current, next)) 6 g. Q/ C+ A: ]: ?3 e5 O return next; $ T" P- p% D* A2 g _( e } % m9 Y+ V: S5 z3 x. d6 p* D4 L } 6 U( m3 B7 `+ p7 | * x4 e. d$ R0 B1 C# j( q) \7 ~ ) K& o1 `6 f& ^- mpublic final int addAndGet(int delta) {5 x9 R' O# z5 Z
for (;;) {- ^% m, l$ B4 G) [) B& U0 a( H
int current = get();; @2 C* A& T( Z5 t5 ?% C
int next = current + delta;% s* b2 X2 K p ^
if (compareAndSet(current, next))( l: `1 A/ Z7 M2 y7 `6 q
return next;& ^/ i0 I2 I8 F8 L
}6 w! [2 U; D4 e
}) O& j3 D" S- D' a- X# x& O. i
( z8 \% c2 C5 _7 q% x9 [. X* b7 t
public String toString() {& M/ K5 v, E4 I) V
return Integer.toString(get());, c9 m# n; H/ h5 \% m( V2 e. `
}$ U( {% O1 c- Z9 Y n
; _* @0 R- ], p: f6 s2 I
& m9 J% \! |* Z, z
public int intValue() { 0 s5 K' l3 w6 @* ^8 {0 f return get(); ; g- H& r. Y, R+ G3 ?* N. h* |' g- q } * _: G) c# U+ v# \8 w1 L8 C" ?1 u7 F! N
) K4 ^9 v$ v- s
public long longValue() { l- [; b F4 K5 u5 {/ m
return (long)get();( R2 p' T. d* p( j& }% f$ Y
}: j* T3 f0 g% [4 q1 t- f* k
; D7 A0 b1 L* x( e! l- }9 y 9 b- e1 T$ z7 H6 {public float floatValue() {7 l8 a; d d, A( u" B8 N; l
return (float)get(); e! Y8 `0 T x- z- i0 S( k; Z7 u2 T" a
}+ G* i* w: n0 K
# a' W4 _0 G6 l, k* r9 y
- ~& U( J# Q- S# b
public double doubleValue() {5 e: x. Z/ V* u
return (double)get();( G: u2 `8 b. _+ @/ u- A
}/ E5 K) e( f) O5 _. E2 L: s! G$ L$ s
--------------------- : g$ ]2 ?7 O4 m7 O4 U4 \
作者:feyshine / b2 f0 d; {& _7 m# T5 `/ q来源:CSDN " @4 q- r; k* Q5 `! s& e* R
6 X6 x) |, D$ E: g5 Z ; g0 ]& g7 G, F# z$ s" q( I6 l" X- N4 w. \% S
$ q0 F/ h; f1 v Q) @% |+ A$ ` 2 S0 b' k$ y1 R% y+ H) Z