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
|
对变量的写入操作不依赖变量的当前值,或者能确保只有单个线程更新变量的值
改变量不会与其他状态变量一起组成不变性的条件
在访问变量时不需要加锁