五.使用volatile關鍵字的場景
synchronized關鍵字是防止多個線程同時執行一段代碼,那么就會很影響程序執行效率,而volatile關鍵字在某些情況下性能要優於synchronized,但是要注意volatile關鍵字是無法替代synchronized關鍵字的,因為volatile關鍵字無法保證操作的原子性。通常來說,使用volatile必須具備以下2個條件:
1)對變量的寫操作不依賴於當前值
2)該變量沒有包含在具有其他變量的不變式中
實際上,這些條件表明,可以被寫入 volatile 變量的這些有效值獨立於任何程序的狀態,包括變量的當前狀態。
事實上,我的理解就是上面的2個條件需要保證操作是原子性操作,才能保證使用volatile關鍵字的程序在並發時能夠正確執行。
下面列舉幾個Java中使用volatile的幾個場景。
1.狀態標記量
1
2
3
4
5
6
7
8
9
|
volatile
boolean
flag =
false
;
while
(!flag){
doSomething();
}
public
void
setFlag() {
flag =
true
;
}
|
1
2
3
4
5
6
7
8
9
10
|
volatile
boolean
inited =
false
;
//線程1:
context = loadContext();
inited =
true
;
//線程2:
while
(!inited ){
sleep()
}
doSomethingwithconfig(context);
|
2.double check
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class
Singleton{
private
volatile
static
Singleton instance =
null
;
private
Singleton() {
}
public
static
Singleton getInstance() {
if
(instance==
null
) {
synchronized
(Singleton.
class
) {
if
(instance==
null
)
instance =
new
Singleton();
}
}
return
instance;
}
|