### Java Volatileå ³é®å å¨java线ç¨å¹¶åå¤çä¸ï¼æä¸ä¸ªå ³é®åvolatileç使ç¨ç®ååå¨å¾å¤§çæ··æ·ï¼ä»¥ä¸ºä½¿ç¨è¿ä¸ªå ³é®åï¼å¨è¿è¡å¤çº¿ç¨å¹¶åå¤ççæ¶åå°±å¯ä»¥ä¸äºå¤§åã Javaè¯è¨æ¯æ¯æå¤çº¿ç¨çï¼ä¸ºäºè§£å³çº¿ç¨å¹¶åçé®é¢ï¼å¨è¯è¨å é¨å¼å ¥äº 忥å å volatile å ³é®åæºå¶ã éæä¾äºä¸¤ç§ä¸»è¦ç¹æ§ï¼äºæ¥ï¼mutual exclusionï¼ åå¯è§æ§ï¼visibilityï¼ãäºæ¥å³ä¸æ¬¡åªå 许ä¸ä¸ªçº¿ç¨æææä¸ªç¹å®çéï¼å æ¤å¯ä½¿ç¨è¯¥ç¹æ§å®ç°å¯¹å ±äº«æ°æ®çåè°è®¿é®åè®®ï¼è¿æ ·ï¼ä¸æ¬¡å°±åªæä¸ä¸ªçº¿ç¨è½å¤ä½¿ç¨è¯¥å ±äº«æ°æ®ãå¯è§æ§è¦æ´å 夿ä¸äºï¼å®å¿ 须确ä¿éæ¾éä¹åå¯¹å ±äº«æ°æ®ååºçæ´æ¹å¯¹äºéåè·å¾è¯¥éçå¦ä¸ä¸ªçº¿ç¨æ¯å¯è§ç ââ å¦ææ²¡æåæ¥æºå¶æä¾çè¿ç§å¯è§æ§ä¿è¯ï¼çº¿ç¨çå°çå ±äº«åéå¯è½æ¯ä¿®æ¹åç弿ä¸ä¸è´çå¼ï¼è¿å°å¼å许å¤ä¸¥éé®é¢ã **synchronized** 忥å大家齿¯è¾çæï¼éè¿ synchronized å ³é®åæ¥å®ç°ï¼ææå ä¸synchronized å åè¯å¥ï¼å¨å¤çº¿ç¨è®¿é®çæ¶åï¼å䏿¶å»åªè½æä¸ä¸ªçº¿ç¨è½å¤ç¨ã synchronized ä¿®é¥°çæ¹æ³æè 代ç åã **volatile** ç¨volatile修饰çåéï¼çº¿ç¨å¨æ¯æ¬¡ä½¿ç¨åéçæ¶åï¼é½ä¼è¯»ååéä¿®æ¹åçæçå¼ãvolatileå¾å®¹æè¢«è¯¯ç¨ï¼ç¨æ¥è¿è¡ååæ§æä½ãvolatile åéå¯ä»¥è¢«ç使¯ä¸ç§ âç¨åº¦è¾è½»ç synchronizedâï¼ä¸synchronized åç¸æ¯ï¼volatile åéæéçç¼ç è¾å°ï¼å¹¶ä¸è¿è¡æ¶å¼éä¹è¾å°ï¼ä½æ¯å®æè½å®ç°çåè½ä¹ä» æ¯ synchronized çä¸é¨åã Volatile åéå ·æ synchronized çå¯è§æ§ç¹æ§ï¼ä½æ¯ä¸å ·å¤ååç¹æ§ãè¿å°±æ¯è¯´çº¿ç¨è½å¤èªå¨åç° volatile åéçææ°å¼ãVolatile åéå¯ç¨äºæä¾çº¿ç¨å®å ¨ï¼ä½æ¯åªè½åºç¨äºé常æéçä¸ç»ç¨ä¾ï¼å¤ä¸ªåéä¹é´æè æä¸ªåéçå½åå¼ä¸ä¿®æ¹åå¼ä¹é´æ²¡æçº¦æãå æ¤ï¼åç¬ä½¿ç¨ volatile è¿ä¸è¶³ä»¥å®ç°è®¡æ°å¨ãäºæ¥éæä»»ä½å ·æä¸å¤ä¸ªåéç¸å ³çä¸åå¼ï¼Invariantsï¼çç±»ï¼ä¾å¦ âstart <=endâï¼ã ä¸é¢çä¸ä¸ªä¾åï¼æä»¬å®ç°ä¸ä¸ªè®¡æ°å¨ï¼æ¯æ¬¡çº¿ç¨å¯å¨çæ¶åï¼ä¼è°ç¨è®¡æ°å¨incæ¹æ³ï¼å¯¹è®¡æ°å¨è¿è¡å ä¸ã æ§è¡ç¯å¢ââjdkçæ¬ï¼jdk1.6.0_31 ï¼å å ï¼3G cpuï¼x86 2.4G public class Counter{ public static int count = 0; public static void inc(){ //è¿éå»¶è¿1毫ç§ï¼ä½¿å¾ç»æææ¾ try { Thread.sleep(1); }catch (InterruptedException e) { } count++; } public static void main(String[] args) { //åæ¶å¯å¨1000个线ç¨ï¼å»è¿è¡i++计ç®ï¼ççå®é ç»æ for (int i = 0;i < 1000; i++) { new Thread(new Runnable(){ @Override public void run(){ Counter.inc(); } }).start(); } //è¿éæ¯æ¬¡è¿è¡çå¼é½æå¯è½ä¸å,å¯è½ä¸º1000 System.out.println("è¿è¡ç»æ:Counter.count=" +Counter.count); } } è¿è¡ç»æ:Counter.count=995 å®é è¿ç®ç»ææ¯æ¬¡å¯è½é½ä¸ä¸æ ·ï¼æ¬æºçç»æä¸ºï¼è¿è¡ç»æ:Counter.count=995ï¼å¯ä»¥çåºï¼å¨å¤çº¿ç¨çç¯å¢ä¸ï¼Counter.countå¹¶æ²¡æææç»ææ¯1000ã å¾å¤äººä»¥ä¸ºï¼è¿ä¸ªæ¯å¤çº¿ç¨å¹¶åé®é¢ï¼åªéè¦å¨åécountä¹åå ä¸volatileå°±å¯ä»¥é¿å è¿ä¸ªé®é¢ï¼é£æä»¬å¨ä¿®æ¹ä»£ç ççï¼ççç»ææ¯ä¸æ¯ç¬¦åæä»¬çææã public class Counter{ public volatile static int count = 0; public static void inc(){ //è¿éå»¶è¿1毫ç§ï¼ä½¿å¾ç»æææ¾ try { Thread.sleep(1); }catch (InterruptedException e) { } count++; } public static void main(String[] args) { //åæ¶å¯å¨1000个线ç¨ï¼å»è¿è¡i++计ç®ï¼ççå®é ç»æ for (int i = 0;i < 1000;i++) { new Thread(new Runnable(){ @Override public void run(){ Counter.inc(); } }).start(); } //è¿éæ¯æ¬¡è¿è¡çå¼é½æå¯è½ä¸å,å¯è½ä¸º1000 System.out.println("è¿è¡ç»æ:Counter.count=" +Counter.count); } } è¿è¡ç»æ:Counter.count=992 è¿è¡ç»æè¿æ¯æ²¡ææä»¬ææç1000ï¼ä¸é¢æä»¬åæä¸ä¸åå å¨ java åå¾åæ¶æ´ç䏿ä¸ï¼æè¿°äºjvmè¿è¡æ¶å»å åçåé ãå ¶ä¸æä¸ä¸ªå ååºåæ¯jvmèææºæ ï¼æ¯ä¸ä¸ªçº¿ç¨è¿è¡æ¶é½æä¸ä¸ªçº¿ç¨æ ï¼çº¿ç¨æ ä¿åäºçº¿ç¨è¿è¡æ¶ååéå¼ä¿¡æ¯ãå½çº¿ç¨è®¿é®æä¸ä¸ªå¯¹è±¡æ¶åå¼çæ¶åï¼é¦å éè¿å¯¹è±¡çå¼ç¨æ¾å°å¯¹åºå¨å å åçåéçå¼ï¼ç¶åæå å ååéçå ·ä½å¼loadå°çº¿ç¨æ¬å°å åä¸ï¼å»ºç«ä¸ä¸ªåé坿¬ï¼ä¹å线ç¨å°±ä¸åå对象å¨å å ååé弿任ä½å ³ç³»ï¼èæ¯ç´æ¥ä¿®æ¹å¯æ¬åéçå¼ï¼å¨ä¿®æ¹å®ä¹åçæä¸ä¸ªæ¶å»ï¼çº¿ç¨éåºä¹åï¼ï¼èªå¨æçº¿ç¨åé坿¬çå¼ååå°å¯¹è±¡å¨å ä¸åéãè¿æ ·å¨å ä¸ç对象çå¼å°±äº§çååäºãä¸é¢ä¸å¹ å¾æè¿°è¿å交äºï¼  read and load ä»ä¸»åå¤å¶åéå°å½åå·¥ä½å å use and assign æ§è¡ä»£ç ï¼æ¹åå ±äº«åéå¼ store and write ç¨å·¥ä½å åæ°æ®å·æ°ä¸»åç¸å ³å 容 å ¶ä¸use and assign å¯ä»¥å¤æ¬¡åºç° 使¯è¿ä¸äºæä½å¹¶ä¸æ¯ååæ§ï¼ä¹å°±æ¯ å¨read loadä¹åï¼å¦æä¸»å åcountåéåçä¿®æ¹ä¹åï¼çº¿ç¨å·¥ä½å åä¸çå¼ç±äºå·²ç»å è½½ï¼ä¸ä¼äº§ç对åºçååï¼æä»¥è®¡ç®åºæ¥çç»æä¼å颿ä¸ä¸æ · 对äºvolatile修饰çåéï¼jvmèææºåªæ¯ä¿è¯ä»ä¸»å åå è½½å°çº¿ç¨å·¥ä½å åç弿¯ææ°ç å¨çº¿ç¨1å countè¿è¡ä¿®æ¹ä¹åï¼ä¼writeå°ä¸»å åä¸ï¼ä¸»å åä¸çcountåéå°±ä¼å为6 线ç¨2ç±äºå·²ç»è¿è¡read,loadæä½ï¼å¨è¿è¡è¿ç®ä¹åï¼ä¹ä¼æ´æ°ä¸»å åcountçåéå¼ä¸º6 导è´ä¸¤ä¸ªçº¿ç¨åæ¶ç¨volatileå ³é®åä¿®æ¹ä¹åï¼è¿æ¯ä¼åå¨å¹¶åçæ åµã **æ£ç¡®ä½¿ç¨ volatile åéçæ¡ä»¶** æ¨åªè½å¨æéçä¸äºæ å½¢ä¸ä½¿ç¨ volatile åéæ¿ä»£éãè¦ä½¿ volatile åéæä¾çæ³ç线ç¨å®å ¨ï¼å¿ é¡»åæ¶æ»¡è¶³ä¸é¢ä¸¤ä¸ªæ¡ä»¶ï¼ * 对åéçåæä½ä¸ä¾èµäºå½åå¼ã * 该åéæ²¡æå å«å¨å ·æå ¶ä»åéçä¸åå¼ä¸ã å®é ä¸ï¼è¿äºæ¡ä»¶è¡¨æï¼å¯ä»¥è¢«åå ¥ volatile åéçè¿äºææå¼ç¬ç«äºä»»ä½ç¨åºçç¶æï¼å æ¬åéçå½åç¶æã 第ä¸ä¸ªæ¡ä»¶çéå¶ä½¿ volatile åéä¸è½ç¨ä½çº¿ç¨å®å ¨è®¡æ°å¨ãè½ç¶å¢éæä½ï¼x++ï¼çä¸å»ç±»ä¼¼ä¸ä¸ªåç¬æä½ï¼å®é ä¸å®æ¯ä¸ä¸ªç±è¯»åï¼ä¿®æ¹ï¼åå ¥æä½åºåç»æçç»åæä½ï¼å¿ 须以å忹弿§è¡ï¼è volatile ä¸è½æä¾å¿ é¡»çååç¹æ§ãå®ç°æ£ç¡®çæä½éè¦ä½¿ x çå¼å¨æä½æé´ä¿æä¸åï¼è volatile åéæ æ³å®ç°è¿ç¹ãï¼ç¶èï¼å¦æå°å¼è°æ´ä¸ºåªä»å个线ç¨åå ¥ï¼é£ä¹å¯ä»¥å¿½ç¥ç¬¬ä¸ä¸ªæ¡ä»¶ãï¼ å¤§å¤æ°ç¼ç¨æ å½¢é½ä¼ä¸è¿ä¸¤ä¸ªæ¡ä»¶çå ¶ä¸ä¹ä¸å²çªï¼ä½¿å¾ volatile åéä¸è½å synchronized 飿 ·æ®ééç¨äºå®ç°çº¿ç¨å®å ¨ã **æ§è½èè** ä½¿ç¨ volatile åéç主è¦åå æ¯å ¶ç®ææ§ï¼å¨æäºæ å½¢ä¸ï¼ä½¿ç¨ volatile åéè¦æ¯ä½¿ç¨ç¸åºçéç®åå¾å¤ãä½¿ç¨ volatile å鿬¡è¦åå æ¯å ¶æ§è½ï¼æäºæ åµä¸ï¼volatile åé忥æºå¶çæ§è½è¦ä¼äºéã å¾é¾ååºåç¡®ãå ¨é¢çè¯ä»·ï¼ä¾å¦ âX æ»æ¯æ¯ Y å¿«âï¼å°¤å ¶æ¯å¯¹ JVM å å¨çæä½èè¨ãï¼ä¾å¦ï¼æäºæ åµä¸ VM ä¹è®¸è½å¤å®å ¨å é¤éæºå¶ï¼è¿ä½¿å¾æä»¬é¾ä»¥æ½è±¡å°æ¯è¾ volatile å synchronized çå¼éãï¼å°±æ¯è¯´ï¼å¨ç®å大夿°çå¤ç卿¶æä¸ï¼volatile 读æä½å¼ééå¸¸ä½ ââ å ä¹åé volatile 读æä½ä¸æ ·ãè volatile åæä½çå¼éè¦æ¯é volatile åæä½å¤å¾å¤ï¼å 为è¦ä¿è¯å¯è§æ§éè¦å®ç°å åçå®ï¼Memory Fenceï¼ï¼å³ä¾¿å¦æ¤ï¼volatile çæ»å¼éä»ç¶è¦æ¯éè·åä½ã volatile æä½ä¸ä¼åé䏿 ·é æé»å¡ï¼å æ¤ï¼å¨è½å¤å®å ¨ä½¿ç¨ volatile çæ åµä¸ï¼volatile å¯ä»¥æä¾ä¸äºä¼äºéçå¯ä¼¸ç¼©ç¹æ§ãå¦æè¯»æä½ç次æ°è¦è¿è¿è¶ è¿åæä½ï¼ä¸éç¸æ¯ï¼volatile åéé常è½å¤åå°åæ¥çæ§è½å¼éã **æ£ç¡®ä½¿ç¨ volatile çæ¨¡å¼** å¾å¤å¹¶åæ§ä¸å®¶äºå®ä¸å¾å¾å¼å¯¼ç¨æ·è¿ç¦» volatile åéï¼å 为使ç¨å®ä»¬è¦æ¯ä½¿ç¨éæ´å 容æåºéãç¶èï¼å¦æè°¨æ å°éµå¾ªä¸äºè¯å¥½å®ä¹ç模å¼ï¼å°±è½å¤å¨å¾å¤åºåå å®å ¨å°ä½¿ç¨ volatile åéãè¦å§ç»ç¢è®°ä½¿ç¨ volatile çéå¶ ââ åªæå¨ç¶æçæ£ç¬ç«äºç¨åºå å ¶ä»å å®¹æ¶æè½ä½¿ç¨ volatile ââ è¿æ¡è§åè½å¤é¿å å°è¿äºæ¨¡å¼æ©å±å°ä¸å®å ¨çç¨ä¾ã