首先我们先看看Bruce Eckel是怎么说的:' Z, }) N' R' i5 S: J5 B1 I
. t% W! Z) ?- E8 S( B* G In the JVM an increment is not atomic and involves both a read and a write. (via the latest Java Performance Tuning Newsletter)2 b) X% g; C6 m1 M C
1 u o5 `* j8 ]5 t3 F
意思很简单,就是说在jvm中自增不是原子性操作,它包含一个读操作和一个写操作。3 P' p0 L5 x" m+ g6 v
! p% V, Z% J/ M 2、以上可能还不能让你信服,要想让人心服口服,就必须用代码说话。正如FaceBook的文化一样:代码赢得争论。那我们就看一段代码: m4 ]/ W3 c0 P9 s- A
- g# e( Y) u) f& y! f2 k$ d
以下的代码是用100个线程同时执行自增操作,每个线程自增100次,如果自增操作是原子性操作的话,那么执行完amount的值为10,000.运行代码之后,你会发现amount的值小于10,000,这就说明自增操作不是原子性的! V- w- ?" \; _% K p+ U4 y2 B
8 M' m l# k+ E& j' T6 u) T, W0 i- J
1./**
: _! w; M9 ^% @: m 7 p9 c$ Z( \, n; ^
2. *
4 [1 k) Z' \. ?7 O i5 `8 ^
+ U+ }( h% X4 c0 u 3. * @author renrun.wu; ]+ a( I+ B0 x/ V# j/ v
3 ], J, b. C9 o) X
4. */- Y6 u+ A) f: |9 g/ k( c' p) H k. U
9 N. s6 r% @/ ]0 M. @, _8 V4 J
5.public class MultiThread implements Runnable {8 Y/ h: Z7 ]7 g: z5 ?
3 ^' ]( ~" I& n& ^ 6. private int count;: b7 u6 G- {( K$ L: c1 o# V5 R
8 H! ]7 q% ]) S/ t1 A
7. private int amount = 1;
, y8 [8 `) ]0 _ E& p2 v6 Q ( ?$ z! B w$ W g! o2 x
8.& S1 \& t [* z3 f
2 |9 L! ]+ f# Y# V4 q: J# \- d
9. public MultiThread() {
u7 ?, q; l+ T ( R( j1 ?5 v1 V( [+ U/ w0 w7 M- D
10. count = 100;0 ]' a6 s4 r# W% z8 I, f
* ^2 [* u" G* ]4 D; T8 o- B, H
11. }
$ d2 x3 L( H% Q8 D. j- q + V3 q! G( ~2 O! l* u) D5 a" C
12.
4 ^0 B2 E; V) w `( K0 F3 b3 H! U9 ?
7 D8 F" q/ h4 F# t( S 13. public MultiThread(int count) {0 Z t7 t6 J# H F6 C
1 o% P2 Z: M& | p 14. this.count = count;2 U% ^! ^: M& ?, \) z+ k
& S, g6 N- T6 ` 15. }; f; ^3 A z9 A% B
! B; X3 B6 Y6 g$ v/ W1 j9 x1 G1 \
16. |