锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
int i1; int geti1() {return i1;}
volatile int i2; int geti2() {return i2;}
int i3; synchronized int geti3() {return i3;}
geti1() 鍦?strong>褰撳墠綰跨▼ 涓珛鍗寵幏鍙栧湪i1 鍙橀噺涓殑鍊箋傜嚎紼嬪彲浠ヨ幏寰楀彉閲忕殑鏈湴鎷瘋礉錛岃屾墍鑾峰緱鐨勫彉閲忕殑鍊煎茍涓嶄竴瀹氫笌鍏朵粬綰跨▼鎵鑾峰緱鐨勫肩浉鍚屻傜壒鍒槸錛屽鏋滃叾浠栫殑綰跨▼淇敼浜唅1 鐨勫鹼紝閭d箞褰撳墠綰跨▼鑾峰緱鐨刬1 鐨勫煎彲鑳戒笌淇敼鍚庣殑鍊兼湁鎵宸埆銆傚疄闄呬笂錛孞ava 鏈変竴縐嶄富鍐呭瓨鐨勬満鍒訛紝浣跨敤涓涓富鍐呭瓨鏉ヤ繚瀛樺彉閲忓綋鍓嶇殑姝g‘鐨勫箋傜嚎紼嬪皢鍙橀噺鐨勫兼嫹璐濆埌鑷繁鐙珛鐨勫唴瀛樹腑錛岃岃繖浜涚嚎紼嬬殑鍐呭瓨鎷瘋礉鍙兘涓庝富鍐呭瓨涓殑鍊間笉鍚屻傛墍浠ュ疄闄呭綋涓彲鑳藉彂鐢熻繖鏍風(fēng)殑鎯呭喌錛屽湪涓誨唴瀛樹腑i1 鐨勫間負(fù)1 錛岀嚎紼? 鍜岀嚎紼? 閮芥洿鏀逛簡i1 錛屼絾鏄嵈娌℃妸鏇存柊鐨勫間紶鍥炵粰涓誨唴瀛樻垨鍏朵粬綰跨▼涓紝閭d箞鍙兘鍦ㄧ嚎紼? 涓璱1 鐨勫間負(fù)2錛岀嚎紼? 涓璱1 鐨勫煎嵈涓?nbsp;3 銆?/span>
鍙︿竴鏂歸潰錛実eti2() 鍙互鏈夋晥鐨勪粠涓誨唴瀛樹腑鑾峰彇i2 鐨勫箋備竴涓獀olatile 綾誨瀷鐨勫彉閲忎笉鍏佽綰跨▼浠庝富鍐呭瓨涓皢鍙橀噺鐨勫兼嫹璐濆埌鑷繁鐨勫瓨鍌ㄧ┖闂淬傚洜姝わ紝涓涓0鏄庝負(fù)volatile 綾誨瀷鐨勫彉閲忓皢鍦ㄦ墍鏈夌殑綰跨▼涓悓姝ョ殑鑾峰緱鏁版嵁錛屼笉璁轟綘鍦ㄤ換浣曠嚎紼嬩腑鏇存敼浜嗗彉閲忥紝鍏朵粬鐨勭嚎紼嬪皢绔嬪嵆寰楀埌鍚屾牱鐨勭粨鏋溿傜敱浜庣嚎紼嬪瓨鍙栨垨鏇存敼鑷繁鐨勬暟鎹嫹璐濇湁鏇撮珮鐨勬晥鐜囷紝鎵浠olatile 綾誨瀷鍙橀噺鍦ㄦц兘涓婃湁鎵娑堣椼?/span>
閭d箞濡傛灉volatile 鍙橀噺宸茬粡鍙互浣挎暟鎹湪綰跨▼闂村悓姝ワ紝閭d箞synchronizes 鐢ㄦ潵騫蹭粈涔堝憿錛熶袱鑰呮湁涓ゆ柟闈㈢殑涓嶅悓銆傞鍏堬紝synchronized 鑾峰彇鍜岄噴鏀劇敱鐩戝惉鍣ㄦ帶鍒剁殑閿侊紝濡傛灉涓や釜綰跨▼閮戒嬌鐢ㄤ竴涓洃鍚櫒( 鍗崇浉鍚屽璞¢攣) 錛岄偅涔堢洃鍚櫒鍙互寮哄埗鍦ㄤ竴涓椂鍒誨彧鏈変竴涓嚎紼嬭兘澶勭悊浠g爜鍧楋紝榪欐槸鏈涓鑸殑鍚屾銆傚彟澶栵紝synchronized 榪樿兘浣垮唴瀛樺悓姝ャ傚湪瀹為檯褰撲腑錛宻ynchronized 浣垮緱鎵鏈夌殑綰跨▼鍐呭瓨涓庝富鍐呭瓨鐩稿悓姝ャ傛墍浠eti3() 鐨勬墽琛岃繃紼嬪涓嬶細(xì)
1. 綰跨▼浠庣洃鍚櫒鑾峰彇瀵硅薄鐨勯攣銆? 榪欓噷鍋囪鐩戝惉鍣ㄩ潪閿侊紝鍚﹀垯綰跨▼鍙湁絳夊埌鐩戝惉鍣ㄨВ閿佹墠鑳借幏鍙栧璞¢攣)
2. 綰跨▼鍐呭瓨鏇存柊鎵鏈?/strong> 鐨勫彉閲忥紝涔熷氨鏄浠栧皢璇誨彇涓誨唴瀛樹腑鐨勫彉閲忎嬌鑷繁鐨勫彉閲忎繚璇佹湁鏁堛?JVM 浼?xì)鋴社敤涓涓?#8220;鑴?#8221;鏍囧織鏉ユ渶浼樺寲榪囩▼錛屼嬌寰椾粎浠呭叿鏈?#8220;鑴?#8221;鏍囧織鍙橀噺琚洿鏂般傝緇嗙殑鎯呭喌鏌ヨJAVA瑙勮寖鐨?7.9)
3. 浠g爜鍧楄鎵ц( 鍦ㄨ繖涓緥瀛愪腑錛岃緗繑鍥炲間負(fù)鍒氬垰浠庝富鍐呭瓨閲嶇疆鐨刬3 褰撳墠鐨勫箋?
4. 浠諱綍鍙橀噺鐨勫彉鏇村皢琚啓鍥炲埌涓誨唴瀛樹腑銆備絾鏄繖涓緥瀛愪腑geti3() 娌℃湁浠涔堝彉鍖栥?/span>
5. 綰跨▼閲婃斁瀵硅薄鐨勯攣緇欑洃鍚櫒銆?/span>
鎵浠olatile 鍙兘鍦ㄧ嚎紼嬪唴瀛樺拰涓誨唴瀛樹箣闂村悓姝ヤ竴涓彉閲忕殑鍊鹼紝鑰宻ynchronized 鍒欏悓姝ュ湪綰跨▼鍐呭瓨鍜屼富鍐呭瓨涔嬮棿鐨勬墍鏈夊彉閲忕殑鍊鹼紝騫朵笖閫氳繃閿佷綇鍜岄噴鏀劇洃鍚櫒鏉ュ疄鐜般傛樉鐒訛紝synchronized 鍦ㄦц兘涓婂皢姣攙olatile 鏇村姞鏈夋墍娑堣椼?/span>
=============鍏充簬涓よ呯殑鍖哄埆===================
1.volatile鏈川鏄湪鍛婅瘔jvm褰撳墠鍙橀噺鍦ㄥ瘎瀛樺櫒錛堝伐浣滃唴瀛橈級涓殑鍊兼槸涓嶇‘瀹氱殑錛岄渶瑕佷粠涓誨瓨涓鍙栵紱synchronized鍒欐槸閿佸畾褰撳墠鍙橀噺錛屽彧鏈夊綋鍓嶇嚎紼嬪彲浠ヨ闂鍙橀噺錛屽叾浠栫嚎紼嬭闃誨浣忋?nbsp; 綰㈠瓧浣撻儴鍒嗙殑鍘熷洜濡備笅錛?br />綰跨▼A淇敼浜嗗彉閲忚繕娌$粨鏉熸椂,鍙﹀鐨勭嚎紼婤鍙互鐪嬪埌宸蹭慨鏀圭殑鍊?鑰屼笖鍙互淇敼榪欎釜鍙橀噺,鑰屼笉鐢ㄧ瓑寰匒閲婃斁閿?鍥犱負(fù)Volatile 鍙橀噺娌′笂閿?/p> package com.abin.lee.servlet.mythread.thread; public class Mythread extends Thread{ package com.abin.lee.servlet.mythread.thread; public class MythreadTest { } package com.abin.lee.servlet.mythread.runnable; public class MyRunnable implements Runnable{ package com.abin.lee.servlet.mythread.runnable; public class MyRunnableTest { package com.abin.lee.servlet.mythread.callable; import java.util.concurrent.Callable; public class MyCallable implements Callable<String>{ package com.abin.lee.servlet.mythread.callable; import java.util.concurrent.ExecutionException; import org.junit.Test; public class MyCallableTest { }
2.volatile浠呰兘浣跨敤鍦ㄥ彉閲忕駭鍒紱synchronized鍒欏彲浠ヤ嬌鐢ㄥ湪鍙橀噺銆佹柟娉曘佸拰綾葷駭鍒殑
3.volatile浠呰兘瀹炵幇鍙橀噺鐨勪慨鏀瑰彲瑙佹э紝涓嶈兘淇濊瘉鍘熷瓙鎬?/span> 錛涜宻ynchronized鍒欏彲浠ヤ繚璇佸彉閲忕殑淇敼鍙鎬у拰鍘熷瓙鎬?nbsp;
4.volatile涓嶄細(xì)閫犳垚綰跨▼鐨勯樆濉烇紱synchronized鍙兘浼?xì)閫犳垚綰跨▼鐨勯樆濉炪?nbsp;
5.volatile鏍囪鐨勫彉閲忎笉浼?xì)琚~栬瘧鍣ㄤ紭鍖栵紱synchronized鏍囪鐨勫彉閲忓彲浠ヨ緙栬瘧鍣ㄤ紭鍖?/p>
]]>
private String name;
public Mythread(String name) {
this.name=name;
}
public void run() {
synchronized(this.name){
System.out.println("寮濮嬫椂闂達(dá)細(xì)"+System.currentTimeMillis()+",綰跨▼鍚嶅瓧錛?+Thread.currentThread().getName());
System.out.println("name="+name);
System.out.println("緇撴潫鏃墮棿錛?+System.currentTimeMillis()+",綰跨▼鍚嶅瓧錛?+Thread.currentThread().getName());
}
}
}
嫻嬭瘯浠g爜錛?br />
public static void main(String[] args) {
Mythread mythread1=new Mythread("ManyThread");
Mythread mythread2=new Mythread("ManyThread");
mythread1.start();
mythread2.start();
}
絎簩縐嶏細(xì)錛圧unnable錛?br />
private String name;
public MyRunnable(String name) {
this.name=name;
}
public synchronized void run(){
System.out.println("寮濮嬫椂闂達(dá)細(xì)"+System.currentTimeMillis()+",綰跨▼鍚嶅瓧錛?+Thread.currentThread().getName());
System.out.println("name="+name);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("緇撴潫鏃墮棿錛?+System.currentTimeMillis()+",綰跨▼鍚嶅瓧錛?+Thread.currentThread().getName());
}
}
嫻嬭瘯浠g爜錛?br />
public static void main(String[] args) {
MyRunnable myRunnable=new MyRunnable("ManyThread");
Thread thread1=new Thread(myRunnable);
Thread thread2=new Thread(myRunnable);
thread1.start();
thread2.start();
}
}
絎笁縐嶏細(xì)錛圕allable錛夎繖縐嶈鏄庝竴涓嬶紝榪欎釜瀹炵幇澶氱嚎紼嬬殑鏂瑰紡鏄湪JDK1.5寮曡繘鐨勶紝鍦╦ava.util.concurrent.Callable 榪欎釜騫跺彂鍖呬笅闈紝騫朵笖鎻愪緵鍚屾榪斿洖緇撴灉鐨勫綰跨▼銆?br />
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
private String name;
public MyCallable(String name) {
this.name=name;
}
public String call() throws Exception {
Lock lock=new ReentrantLock();
lock.lock();
String result="";
try {
System.out.println("寮濮嬫椂闂達(dá)細(xì)"+System.currentTimeMillis()+",綰跨▼鍚嶅瓧錛?+Thread.currentThread().getName());
System.out.println("name="+name);
if(name.equals("ManyThread")){
result="success";
}else{
result="failure";
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("緇撴潫鏃墮棿錛?+System.currentTimeMillis()+",綰跨▼鍚嶅瓧錛?+Thread.currentThread().getName());
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.unlock();
}
return result;
}
}
嫻嬭瘯浠g爜錛?br />
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
@Test
public void testMyCallable() throws InterruptedException, ExecutionException{
ExecutorService executor=Executors.newFixedThreadPool(3);
MyCallable myCallable=new MyCallable("ManyThread");
Future future1=executor.submit(myCallable);
System.out.println("future1="+future1.get());
Future future2=executor.submit(myCallable);
System.out.println("future2="+future2.get());
Future future3=executor.submit(myCallable);
System.out.println("future3="+future3.get());
}
嫻嬭瘯緇撴灉錛?br />
]]>