-
volatile变量
-
原子变量:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; public class TestVolatile
{ private static int CALC_TIME
= 1000 ; private static final int THREAD_NUM
= 100 ; private AtomicInteger
ai; private int i; private volatile int vi; public TestVolatile(){ ai
= new AtomicInteger( 0 ); i
= 0 ; vi
= 0 ; } public static void main(String[]
args) throws InterruptedException
{ System.out.println( "Calculation
Times:" +
CALC_TIME + "
----------------------" ); test(); CALC_TIME
= 10000 ; System.out.println( "Calculation
Times:" +
CALC_TIME + "
----------------------" ); test(); CALC_TIME
= 100000 ; System.out.println( "Calculation
Times:" +
CALC_TIME + "
----------------------" ); test(); CALC_TIME
= 1000000 ; System.out.println( "Calculation
Times:" +
CALC_TIME + "
----------------------" ); test(); } private static void test() throws InterruptedException
{ testAi(); testI(); testVi(); } private static void testAi() throws InterruptedException
{ TestVolatile
testVolatile = new TestVolatile(); CountDownLatch
begSignal = new CountDownLatch( 1 ); CountDownLatch
endSignal = new CountDownLatch(THREAD_NUM); for ( int i
= 0 ;
i < THREAD_NUM; i++) { new Thread(
testVolatile. new WorkerAI(begSignal,
endSignal) ).start(); } long startTime
= System.currentTimeMillis(); begSignal.countDown(); endSignal.await(); long endTime
= System.currentTimeMillis(); System.out.println( "Total
time consumed by atomic increment : " +
(endTime-startTime)); } private static void testI() throws InterruptedException
{ TestVolatile
testVolatile = new TestVolatile(); CountDownLatch
begSignal = new CountDownLatch( 1 ); CountDownLatch
endSignal = new CountDownLatch(THREAD_NUM); for ( int i
= 0 ;
i < THREAD_NUM; i++) { new Thread(
testVolatile. new WorkerI(begSignal,
endSignal) ).start(); } long startTime
= System.currentTimeMillis(); begSignal.countDown(); endSignal.await(); long endTime
= System.currentTimeMillis(); System.out.println( "Total
time consumed by synchronized increment : " +
(endTime-startTime)); } private static void testVi() throws InterruptedException
{ TestVolatile
testVolatile = new TestVolatile(); CountDownLatch
begSignal = new CountDownLatch( 1 ); CountDownLatch
endSignal = new CountDownLatch(THREAD_NUM); for ( int i
= 0 ;
i < THREAD_NUM; i++) { new Thread(
testVolatile. new WorkerVI(begSignal,
endSignal) ).start(); } long startTime
= System.currentTimeMillis(); begSignal.countDown(); endSignal.await(); long endTime
= System.currentTimeMillis(); System.out.println( "Total
time consumed by volatile increment : " +
(endTime-startTime)); } public void incrAi()
{ ai.getAndIncrement(); } public synchronized void incrI()
{ i++; } /** *
这个函数不是线程安全,很可能得到错误的结果,这里只是为了测试读取volatile变量的效率 */ public void incrVi()
{ vi++; } class WorkerAI implements Runnable
{ private CountDownLatch
beginSignal; private CountDownLatch
endSignal; public WorkerAI(CountDownLatch
begin, CountDownLatch end) { this .beginSignal
= begin; this .endSignal
= end; } @Override public void run()
{ try { beginSignal.await(); } catch (InterruptedException
e) { e.printStackTrace(); } for ( int j= 0 ;
j<CALC_TIME; j++){ incrAi(); } endSignal.countDown(); } } class WorkerI implements Runnable
{ private CountDownLatch
beginSignal; private CountDownLatch
endSignal; public WorkerI(CountDownLatch
begin, CountDownLatch end) { this .beginSignal
= begin; this .endSignal
= end; } @Override public void run()
{ try { beginSignal.await(); } catch (InterruptedException
e) { e.printStackTrace(); } for ( int j= 0 ;
j<CALC_TIME; j++){ incrAi(); } endSignal.countDown(); } } class WorkerVI implements Runnable
{ private CountDownLatch
beginSignal; private CountDownLatch
endSignal; public WorkerVI(CountDownLatch
begin, CountDownLatch end) { this .beginSignal
= begin; this .endSignal
= end; } @Override public void run()
{ try { beginSignal.await(); } catch (InterruptedException
e) { e.printStackTrace(); } for ( int j= 0 ;
j<CALC_TIME; j++){ incrVi(); } endSignal.countDown(); } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
Calculation
Times: 1000 ---------------------- Total
time consumed by atomic increment : 8 Total
time consumed by synchronized increment : 6 Total
time consumed by volatile increment : 5 Calculation
Times: 10000 ---------------------- Total
time consumed by atomic increment : 23 Total
time consumed by synchronized increment : 24 Total
time consumed by volatile increment : 15 Calculation
Times: 100000 ---------------------- Total
time consumed by atomic increment : 354 Total
time consumed by synchronized increment : 360 Total
time consumed by volatile increment : 148 Calculation
Times: 1000000 ---------------------- Total
time consumed by atomic increment : 3579 Total
time consumed by synchronized increment : 3608 Total
time consumed by volatile increment : 1519 |
-
对变量的写入操作不依赖变量的当前值,或者能确保只有单个线程更新变量的值
-
改变量不会与其他状态变量一起组成不变性的条件
-
在访问变量时不需要加锁