娌℃湁鍐欏叆涓誨瓨?shù)?/span>");
System.out.println("====");
}
},"THREAD_ONE").start();
new Thread(new Runnable(){
public void run() {
String str=getStr();
System.out.println(str);
}
},"THREAD_TWO").start();
}
public static void main(String[] args){
VolatileTest vt=new VolatileTest();
vt.doit();
}
}
涓婇潰鐨勪緥瀛?濡傛灉涓嶄嬌鐢╲olatile鍙橀噺,鍙兘鍑虹幇鐨勬儏鍐墊槸(鍑虹幇鍑犵巼寰堝皬),THREAD_ONE綰跨▼鍦╯etStr()鍚?THREAD_TWO鎵ц浜?jiǎn)getStr(),浣嗘槸鐢變簬騫舵病鏈夊皢鏁版嵁鍐欏叆涓誨瓨?shù)?鑰屾鏃秅etStr()鑾峰緱鐨勬暟鎹皢鏄繃鏃舵暟鎹?
瑙e喅鐨勬柟寮?閫氳繃lock(寮閿姣旇緝澶?,浣跨敤volatile鍙橀噺(濡備笂).
姝g‘浣跨敤 volatile 鐨勬ā寮?/span>
1.鐘舵佹爣蹇?br />
volatile boolean shutdownRequested;

public void shutdown() { shutdownRequested = true; }
public void doWork() {
while (!shutdownRequested) {
// do stuff
}
}
鍙兘鍦ㄥ彟涓涓嚎紼嬩腑璋冪敤shutdown(),閭d箞浣跨敤volatile鍙互淇濊瘉shutdownRequested鍙鎬?鎵浠ヤ笉闇瑕佷嬌鐢╨ock鏉ュ疄鐜版暟鎹悓姝?
璇ユā寮忕壒寰?鍙湁涓縐嶇姸鎬佺殑杞崲.
2.涓嬈℃у畨鍏ㄥ彂甯?br />
public class BackgroundFloobleLoader {
public volatile Flooble theFlooble;
public void initInBackground() {
// do lots of stuff
theFlooble = new Flooble(); // this is the only write to theFlooble
}
}
public class SomeOtherClass {
public void doWork() {
while (true) {
// do some stuff
// use the Flooble, but only if it is ready
if (floobleLoader.theFlooble != null)
doSomething(floobleLoader.theFlooble);
}
}
}
鍦ㄥ鏋?span style="color: #000000;">initInBackground(鍐欏叆)鍜?/span>doWork(璇誨彇)鍦ㄤ笉鍚岀嚎紼嬪悓鏃舵墽琛屾椂,閭d箞鍙兘鑾峰緱鐨勬洿鏂板悗鐨凢looble瀵硅薄涔熷彲鑳芥槸鏈洿鏂板墠鐨?鑰屾槸鐢╲olatile鍙互淇濊瘉鏄鍙栧埌鏇存柊鍚庣殑瀵硅薄.
璇ユā寮忕殑涓涓繀瑕佹潯浠舵槸錛氳鍙戝竷鐨勫璞″繀欏繪槸綰跨▼瀹夊叏鐨勶紝鎴栬呮槸鏈夋晥鐨勪笉鍙彉瀵硅薄錛堟湁鏁堜笉鍙彉鎰忓懗鐫瀵硅薄鐨勭姸鎬佸湪鍙戝竷涔嬪悗姘歌繙涓嶄細(xì)琚慨鏀癸級(jí)銆?br />
3.鐙珛瑙傚療
public class UserManager {
public volatile String lastUser;
public boolean authenticate(String user, String password) {
boolean valid = passwordIsValid(user, password);
if (valid) {
User u = new User();
activeUsers.add(u);
lastUser = user;
}
return valid;
}
}
璇ユā寮忓彲浠ョ敤浜庢敹闆嗘渶榪戜竴嬈$櫥褰曚俊鎭?騫舵彁浜ゅ叾浠栧簲鐢ㄥ鐞?
4.“volatile bean” 妯″紡
@ThreadSafe
public class Person {
private volatile String firstName;
private volatile String lastName;
private volatile int age;
public String getFirstName() { return firstName; }
public String getLastName() { return lastName; }
public int getAge() { return age; }
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public void setAge(int age) {
this.age = age;
}
}
緇撴潫璇?/span>
涓庨攣鐩告瘮錛孷olatile 鍙橀噺鏄竴縐嶉潪甯哥畝鍗曚絾鍚屾椂鍙堥潪甯歌剢寮辯殑鍚屾鏈哄埗錛屽畠鍦ㄦ煇浜涙儏鍐典笅灝嗘彁渚涗紭?shù)簬閿佺殑鎬ц兘鍜屼幾緙╂с傚鏋滀弗鏍奸伒寰?
volatile 鐨勪嬌鐢ㄦ潯浠?鈥斺?鍗沖彉閲忕湡姝g嫭绔嬩簬鍏朵粬鍙橀噺鍜岃嚜宸變互鍓嶇殑鍊?鈥斺?鍦ㄦ煇浜涙儏鍐典笅鍙互浣跨敤 volatile
浠f浛 synchronized
鏉ョ畝鍖栦唬鐮併傜劧鑰岋紝浣跨敤 volatile
鐨勪唬鐮佸線寰姣斾嬌鐢ㄩ攣鐨勪唬鐮佹洿鍔犲鏄撳嚭閿欍傛湰鏂囦粙緇嶇殑妯″紡娑電洊浜?jiǎn)鍙互鋴社?volatile
浠f浛 synchronized
鐨勬渶甯歌鐨勪竴浜涚敤渚嬨傞伒寰繖浜涙ā寮忥紙娉ㄦ剰浣跨敤鏃朵笉瑕佽秴榪囧悇鑷殑闄愬埗錛夊彲浠ュ府鍔╂?zhèn)ㄥ畨鍏ㄥ湴瀹炵幇澶у鏁扮敤渚嬪Q屼嬌鐢?volatile 鍙橀噺鑾峰緱鏇翠匠鎬ц兘銆?

]]>