JavaÄÚ´æÄ£Ð͹淶ÁËJavaÐéÄâ»úÓë¼ÆËã»úÄÚ´æÊÇÈçºÎÐͬ¹¤×÷µÄ¡£JavaÐéÄâ»úÊÇÒ»¸öÍêÕûµÄ¼ÆËã»úµÄÒ»¸öÄ£ÐÍ£¬Òò´ËÕâ¸öÄ£ÐÍ×ÔȻҲ°üº¬Ò»¸öÄÚ´æÄ£ÐÍ¡ª¡ªÓÖ³ÆÎªJavaÄÚ´æÄ£ÐÍ¡£
Èç¹ûÄãÏëÉè¼Æ±íÏÖÁ¼ºÃµÄ²¢·¢³ÌÐò£¬Àí½âJavaÄÚ´æÄ£ÐÍÊǷdz£ÖØÒªµÄ¡£JavaÄÚ´æÄ£Ð͹涨ÁËÈçºÎºÍºÎʱ¿ÉÒÔ¿´µ½ÓÉÆäËûÏß³ÌÐ޸ĹýºóµÄ¹²Ïí±äÁ¿µÄÖµ£¬ÒÔ¼°ÔÚ±ØÐëʱÈçºÎͬ²½µÄ·ÃÎʹ²Ïí±äÁ¿¡£
ÔʼµÄJavaÄÚ´æÄ£ÐÍ´æÔÚһЩ²»×㣬Òò´ËJavaÄÚ´æÄ£ÐÍÔÚJava1.5ʱ±»ÖØÐÂÐÞ¶©¡£Õâ¸ö°æ±¾µÄJavaÄÚ´æÄ£ÐÍÔÚJava8ÖÐÈËÔÚʹÓá£
JavaÄÚ´æÄ£ÐÍÄÚ²¿ÔÀí
JavaÄÚ´æÄ£ÐͰÑJavaÐéÄâ»úÄÚ²¿»®·ÖΪÏß³ÌÕ»ºÍ¶Ñ¡£ÕâÕÅͼÑÝʾÁËJavaÄÚ´æÄ£Ð͵ÄÂß¼ÊÓͼ¡£

ÿһ¸öÔËÐÐÔÚJavaÐéÄâ»úÀïµÄÏ̶߳¼ÓµÓÐ×Ô¼ºµÄÏß³ÌÕ»¡£Õâ¸öÏß³ÌÕ»°üº¬ÁËÕâ¸öÏ̵߳÷Óõķ½·¨µ±Ç°Ö´ÐеãÏà¹ØµÄÐÅÏ¢¡£Ò»¸öÏ߳̽öÄÜ·ÃÎÊ×Ô¼ºµÄÏß³ÌÕ»¡£Ò»¸öÏ̴߳´½¨µÄ±¾µØ±äÁ¿¶ÔÆäËüÏ̲߳»¿É¼û£¬½ö×Ô¼º¿É¼û¡£¼´Ê¹Á½¸öÏß³ÌÖ´ÐÐͬÑùµÄ´úÂ룬ÕâÁ½¸öÏß³ÌÈÎÈ»ÔÚÔÚ×Ô¼ºµÄÏß³ÌÕ»ÖеĴúÂëÀ´´´½¨±¾µØ±äÁ¿¡£Òò´Ë£¬Ã¿¸öÏß³ÌÓµÓÐÿ¸ö±¾µØ±äÁ¿µÄ¶ÀÓа汾¡£
ËùÓÐÔʼÀàÐ͵ı¾µØ±äÁ¿¶¼´æ·ÅÔÚÏß³ÌÕ»ÉÏ£¬Òò´Ë¶ÔÆäËüÏ̲߳»¿É¼û¡£Ò»¸öÏ߳̿ÉÄÜÏòÁíÒ»¸öÏ̴߳«µÝÒ»¸öÔʼÀàÐͱäÁ¿µÄ¿½±´£¬µ«ÊÇËü²»Äܹ²ÏíÕâ¸öÔʼÀàÐͱäÁ¿×ÔÉí¡£
¶ÑÉϰüº¬ÔÚJava³ÌÐòÖд´½¨µÄËùÓжÔÏó£¬ÎÞÂÛÊÇÄÄÒ»¸ö¶ÔÏó´´½¨µÄ¡£Õâ°üÀ¨ÔʼÀàÐ͵ĶÔÏó°æ±¾¡£Èç¹ûÒ»¸ö¶ÔÏó±»´´½¨È»ºó¸³Öµ¸øÒ»¸ö¾Ö²¿±äÁ¿£¬»òÕßÓÃÀ´×÷ΪÁíÒ»¸ö¶ÔÏóµÄ³ÉÔ±±äÁ¿£¬Õâ¸ö¶ÔÏóÈÎÈ»ÊÇ´æ·ÅÔÚ¶ÑÉÏ¡£
ÏÂÃæÕâÕÅͼÑÝʾÁ˵÷ÓÃÕ»ºÍ±¾µØ±äÁ¿´æ·ÅÔÚÏß³ÌÕ»ÉÏ£¬¶ÔÏó´æ·ÅÔÚ¶ÑÉÏ¡£

Ò»¸ö±¾µØ±äÁ¿¿ÉÄÜÊÇÔʼÀàÐÍ£¬ÔÚÕâÖÖÇé¿öÏ£¬Ëü×ÜÊÇ¡°´ôÔÚ¡±Ïß³ÌÕ»ÉÏ¡£
Ò»¸ö±¾µØ±äÁ¿Ò²¿ÉÄÜÊÇÖ¸ÏòÒ»¸ö¶ÔÏóµÄÒ»¸öÒýÓá£ÔÚÕâÖÖÇé¿öÏ£¬ÒýÓã¨Õâ¸ö±¾µØ±äÁ¿£©´æ·ÅÔÚÏß³ÌÕ»ÉÏ£¬µ«ÊǶÔÏó±¾Éí´æ·ÅÔÚ¶ÑÉÏ¡£
Ò»¸ö¶ÔÏó¿ÉÄܰüº¬·½·¨£¬ÕâЩ·½·¨¿ÉÄܰüº¬±¾µØ±äÁ¿¡£ÕâЩ±¾µØ±äÁ¿ÈÎÈ»´æ·ÅÔÚÏß³ÌÕ»ÉÏ£¬¼´Ê¹ÕâЩ·½·¨ËùÊôµÄ¶ÔÏó´æ·ÅÔÚ¶ÑÉÏ¡£
Ò»¸ö¶ÔÏóµÄ³ÉÔ±±äÁ¿¿ÉÄÜËæ×ÅÕâ¸ö¶ÔÏó×ÔÉí´æ·ÅÔÚ¶ÑÉÏ¡£²»¹ÜÕâ¸ö³ÉÔ±±äÁ¿ÊÇÔʼÀàÐÍ»¹ÊÇÒýÓÃÀàÐÍ¡£
¾²Ì¬³ÉÔ±±äÁ¿¸úËæ×ÅÀඨÒåÒ»ÆðÒ²´æ·ÅÔÚ¶ÑÉÏ¡£
´æ·ÅÔÚ¶ÑÉϵĶÔÏó¿ÉÒÔ±»ËùÓгÖÓжÔÕâ¸ö¶ÔÏóÒýÓõÄÏ̷߳ÃÎÊ¡£µ±Ò»¸öÏ߳̿ÉÒÔ·ÃÎÊÒ»¸ö¶ÔÏóʱ£¬ËüÒ²¿ÉÒÔ·ÃÎÊÕâ¸ö¶ÔÏóµÄ³ÉÔ±±äÁ¿¡£Èç¹ûÁ½¸öÏß³Ìͬʱµ÷ÓÃͬһ¸ö¶ÔÏóÉϵÄͬһ¸ö·½·¨£¬ËüÃǽ«»á¶¼·ÃÎÊÕâ¸ö¶ÔÏóµÄ³ÉÔ±±äÁ¿£¬µ«ÊÇÿһ¸öÏ̶߳¼ÓµÓÐÕâ¸ö±¾µØ±äÁ¿µÄ˽Óп½±´¡£
ÏÂͼÑÝʾÁËÉÏÃæÌáµ½µÄµã£º

Á½¸öÏß³ÌÓµÓÐһЩÁеı¾µØ±äÁ¿¡£ÆäÖÐÒ»¸ö±¾µØ±äÁ¿£¨Local Variable
2£©Ö´ÐжÑÉϵÄÒ»¸ö¹²Ïí¶ÔÏó£¨Object 3£©¡£ÕâÁ½¸öÏ̷ֱ߳ðÓµÓÐͬһ¸ö¶ÔÏóµÄ²»Í¬ÒýÓá£ÕâЩÒýÓö¼ÊDZ¾µØ±äÁ¿£¬Òò´Ë´æ·ÅÔÚ¸÷×ÔÏ̵߳ÄÏß³ÌÕ»ÉÏ¡£ÕâÁ½¸ö²»Í¬µÄÒýÓÃÖ¸Ïò¶ÑÉÏͬһ¸ö¶ÔÏó¡£
×¢Ò⣬Õâ¸ö¹²Ïí¶ÔÏó£¨Object 3£©³ÖÓÐObject2ºÍObject4Ò»¸öÒýÓÃ×÷ΪÆä³ÉÔ±±äÁ¿£¨ÈçͼÖÐObject3Ö¸ÏòObject2ºÍObject4µÄ¼ýÍ·£©¡£Í¨¹ýÔÚObject3ÖÐÕâЩ³ÉÔ±±äÁ¿ÒýÓã¬ÕâÁ½¸öÏ߳̾ͿÉÒÔ·ÃÎÊObject2ºÍObject4¡£
ÕâÕÅͼҲչʾÁËÖ¸Ïò¶ÑÉÏÁ½¸ö²»Í¬¶ÔÏóµÄÒ»¸ö±¾µØ±äÁ¿¡£ÔÚÕâÖÖÇé¿öÏ£¬Ö¸ÏòÁ½¸ö²»Í¬¶ÔÏóµÄÒýÓò»ÊÇͬһ¸ö¶ÔÏó¡£ÀíÂÛÉÏ£¬Á½¸öÏ̶߳¼¿ÉÒÔ·ÃÎÊObject1ºÍObject5£¬Èç¹ûÁ½¸öÏ̶߳¼ÓµÓÐÁ½¸ö¶ÔÏóµÄÒýÓᣵ«ÊÇÔÚÉÏͼÖУ¬Ã¿Ò»¸öÏ߳̽öÓÐÒ»¸öÒýÓÃÖ¸ÏòÁ½¸ö¶ÔÏóÆäÖÐÖ®Ò»¡£
Òò´Ë£¬Ê²Ã´ÀàÐ͵ÄJava´úÂë»áµ¼ÖÂÉÏÃæµÄÄÚ´æÍ¼ÄØ£¿ÈçÏÂËùʾ£º
public class MyRunnable implements Runnable() {
public void run() {
methodOne();
}
public void methodOne() {
int localVariable1 = 45;
MySharedObject localVariable2 =
MySharedObject.sharedInstance;
//... do more with local variables.
methodTwo();
}
public void methodTwo() {
Integer localVariable1 = new Integer(99);
//... do more with local variable.
}
}
public class MySharedObject {
//static variable pointing to instance of MySharedObject
public static final MySharedObject sharedInstance
=
new MySharedObject();
//member variables pointing to two objects on
the heap
public Integer object2 = new Integer(22);
public Integer object4 = new Integer(44);
public long member1 = 12345;
public long member1 = 67890;
} |
Èç¹ûÁ½¸öÏß³ÌͬʱִÐÐrun()·½·¨£¬¾Í»á³öÏÖÉÏͼËùʾµÄÇé¾°¡£run()·½·¨µ÷ÓÃmethodOne()·½·¨£¬methodOne()µ÷ÓÃmethodTwo()·½·¨¡£
methodOne()ÉùÃ÷ÁËÒ»¸öÔʼÀàÐ͵ı¾µØ±äÁ¿ºÍÒ»¸öÒýÓÃÀàÐ͵ı¾µØ±äÁ¿¡£
ÿ¸öÏß³ÌÖ´ÐÐmethodOne()¶¼»áÔÚËüÃǶÔÓ¦µÄÏß³ÌÕ»ÉÏ´´½¨localVariable1ºÍlocalVariable2µÄ˽Óп½±´¡£localVariable1±äÁ¿±Ë´ËÍêÈ«¶ÀÁ¢£¬½ö¡°Éú»î¡±ÔÚÿ¸öÏ̵߳ÄÏß³ÌÕ»ÉÏ¡£Ò»¸öÏ߳̿´²»µ½ÁíÒ»¸öÏ̶߳ÔËüµÄlocalVariable1˽Óп½±´×ö³öµÄÐ޸ġ£
ÿ¸öÏß³ÌÖ´ÐÐmethodOne()ʱҲ½«»á´´½¨ËüÃǸ÷×ÔµÄlocalVariable2¿½±´¡£È»¶ø£¬Á½¸ölocalVariable2µÄ²»Í¬¿½±´¶¼Ö¸Ïò¶ÑÉϵÄͬһ¸ö¶ÔÏó¡£´úÂëÖÐͨ¹ýÒ»¸ö¾²Ì¬±äÁ¿ÉèÖÃlocalVariable2Ö¸ÏòÒ»¸ö¶ÔÏóÒýÓ᣽ö´æÔÚÒ»¸ö¾²Ì¬±äÁ¿µÄÒ»·Ý¿½±´£¬Õâ·Ý¿½±´´æ·ÅÔÚ¶ÑÉÏ¡£Òò´Ë£¬localVariable2µÄÁ½·Ý¿½±´¶¼Ö¸ÏòÓÉMySharedObjectÖ¸ÏòµÄ¾²Ì¬±äÁ¿µÄͬһ¸öʵÀý¡£MySharedObjectʵÀýÒ²´æ·ÅÔÚ¶ÑÉÏ¡£Ëü¶ÔÓ¦ÓÚÉÏͼÖеÄObject3¡£
×¢Ò⣬MySharedObjectÀàÒ²°üº¬Á½¸ö³ÉÔ±±äÁ¿¡£ÕâЩ³ÉÔ±±äÁ¿Ëæ×ÅÕâ¸ö¶ÔÏó´æ·ÅÔÚ¶ÑÉÏ¡£ÕâÁ½¸ö³ÉÔ±±äÁ¿Ö¸ÏòÁíÍâÁ½¸öInteger¶ÔÏó¡£ÕâЩInteger¶ÔÏó¶ÔÓ¦ÓÚÉÏͼÖеÄObject2ºÍObject4.
×¢Ò⣬methodTwo()´´½¨Ò»¸öÃûΪlocalVariableµÄ±¾µØ±äÁ¿¡£Õâ¸ö³ÉÔ±±äÁ¿ÊÇÒ»¸öÖ¸ÏòÒ»¸öInteger¶ÔÏóµÄ¶ÔÏóÒýÓá£Õâ¸ö·½·¨ÉèÖÃlocalVariable1ÒýÓÃÖ¸ÏòÒ»¸öеÄIntegerʵÀý¡£ÔÚÖ´ÐÐmethodTwo·½·¨Ê±£¬localVariable1ÒýÓý«»áÔÚÿ¸öÏß³ÌÖдæ·ÅÒ»·Ý¿½±´¡£ÕâÁ½¸öInteger¶ÔÏóʵÀý»¯½«»á±»´æ´¢¶ÑÉÏ£¬µ«ÊÇÿ´ÎÖ´ÐÐÕâ¸ö·½·¨Ê±£¬Õâ¸ö·½·¨¶¼»á´´½¨Ò»¸öеÄInteger¶ÔÏó£¬Á½¸öÏß³ÌÖ´ÐÐÕâ¸ö·½·¨½«»á´´½¨Á½¸ö²»Í¬µÄIntegerʵÀý¡£methodTwo·½·¨´´½¨µÄInteger¶ÔÏó¶ÔÓ¦ÓÚÉÏͼÖеÄObject1ºÍObject5¡£
»¹ÓÐÒ»µã£¬MySharedObjectÀàÖеÄÁ½¸ölongÀàÐ͵ijÉÔ±±äÁ¿ÊÇÔʼÀàÐ͵ġ£ÒòΪ£¬ÕâЩ±äÁ¿ÊdzÉÔ±±äÁ¿£¬ËùÒÔËüÃÇÈÎÈ»Ëæ×ŸöÔÏó´æ·ÅÔÚ¶ÑÉÏ£¬½öÓб¾µØ±äÁ¿´æ·ÅÔÚÏß³ÌÕ»ÉÏ¡£
Ó²¼þÄÚ´æ¼Ü¹¹
ÏÖ´úÓ²¼þÄÚ´æÄ£ÐÍÓëJavaÄÚ´æÄ£ÐÍÓÐһЩ²»Í¬¡£Àí½âÄÚ´æÄ£Ðͼܹ¹ÒÔ¼°JavaÄÚ´æÄ£ÐÍÈçºÎÓëËüÐͬ¹¤×÷Ò²ÊǷdz£ÖØÒªµÄ¡£Õⲿ·ÖÃèÊöÁËͨÓõÄÓ²¼þÄÚ´æ¼Ü¹¹£¬ÏÂÃæµÄ²¿·Ö½«»áÃèÊöJavaÄÚ´æÊÇÈçºÎÓëËü¡°ÁªÊÖ¡±¹¤×÷µÄ¡£
ÏÂÃæÊÇÏÖ´ú¼ÆËã»úÓ²¼þ¼Ü¹¹µÄ¼òµ¥Í¼Ê¾£º

Ò»¸öÏÖ´ú¼ÆËã»úͨ³£ÓÉÁ½¸ö»òÕß¶à¸öCPU¡£ÆäÖÐһЩCPU»¹ÓжàºË¡£´ÓÕâÒ»µã¿ÉÒÔ¿´³ö£¬ÔÚÒ»¸öÓÐÁ½¸ö»òÕß¶à¸öCPUµÄÏÖ´ú¼ÆËã»úÉÏͬʱÔËÐжà¸öÏß³ÌÊÇ¿ÉÄܵġ£Ã¿¸öCPUÔÚijһʱ¿ÌÔËÐÐÒ»¸öÏß³ÌÊÇûÓÐÎÊÌâµÄ¡£ÕâÒâζ×Å£¬Èç¹ûÄãµÄJava³ÌÐòÊǶàÏ̵߳ģ¬ÔÚÄãµÄJava³ÌÐòÖÐÿ¸öCPUÉÏÒ»¸öÏ߳̿ÉÄÜͬʱ£¨²¢·¢£©Ö´ÐС£
ÿ¸öCPU¶¼°üº¬Ò»ÏµÁеļĴæÆ÷£¬ËüÃÇÊÇCPUÄÚÄÚ´æµÄ»ù´¡¡£CPUÔڼĴæÆ÷ÉÏÖ´ÐвÙ×÷µÄËÙ¶ÈÔ¶´óÓÚÔÚÖ÷´æÉÏÖ´ÐеÄËÙ¶È¡£ÕâÊÇÒòΪCPU·ÃÎʼĴæÆ÷µÄËÙ¶ÈÔ¶´óÓÚÖ÷´æ¡£
ÿ¸öCPU¿ÉÄÜ»¹ÓÐÒ»¸öCPU»º´æ²ã¡£Êµ¼ÊÉÏ£¬¾ø´ó¶àÊýµÄÏÖ´úCPU¶¼ÓÐÒ»¶¨´óСµÄ»º´æ²ã¡£CPU·ÃÎÊ»º´æ²ãµÄËÙ¶È¿ìÓÚ·ÃÎÊÖ÷´æµÄËÙ¶È£¬µ«Í¨³£±È·ÃÎÊÄÚ²¿¼Ä´æÆ÷µÄËÙ¶È»¹ÒªÂýÒ»µã¡£Ò»Ð©CPU»¹Óжà²ã»º´æ£¬µ«ÕâЩ¶ÔÀí½âJavaÄÚ´æÄ£ÐÍÈçºÎºÍÄÚ´æ½»»¥²»ÊÇÄÇÃ´ÖØÒª¡£Ö»ÒªÖªµÀCPUÖпÉÒÔÓÐÒ»¸ö»º´æ²ã¾Í¿ÉÒÔÁË¡£
Ò»¸ö¼ÆËã»ú»¹°üº¬Ò»¸öÖ÷´æ¡£ËùÓеÄCPU¶¼¿ÉÒÔ·ÃÎÊÖ÷´æ¡£Ö÷´æÍ¨³£±ÈCPUÖеĻº´æ´óµÃ¶à¡£
ͨ³£Çé¿öÏ£¬µ±Ò»¸öCPUÐèÒª¶ÁÈ¡Ö÷´æÊ±£¬Ëü»á½«Ö÷´æµÄ²¿·Ö¶Áµ½CPU»º´æÖС£ËüÉõÖÁ¿ÉÄܽ«»º´æÖеIJ¿·ÖÄÚÈݶÁµ½ËüµÄÄÚ²¿¼Ä´æÆ÷ÖУ¬È»ºóÔڼĴæÆ÷ÖÐÖ´ÐвÙ×÷¡£µ±CPUÐèÒª½«½á¹ûд»Øµ½Ö÷´æÖÐȥʱ£¬Ëü»á½«ÄÚ²¿¼Ä´æÆ÷µÄֵˢе½»º´æÖУ¬È»ºóÔÚij¸öʱ¼äµã½«ÖµË¢Ð»ØÖ÷´æ¡£
µ±CPUÐèÒªÔÚ»º´æ²ã´æ·ÅһЩ¶«Î÷µÄʱºò£¬´æ·ÅÔÚ»º´æÖеÄÄÚÈÝͨ³£»á±»Ë¢Ð»ØÖ÷´æ¡£CPU»º´æ¿ÉÒÔÔÚijһʱ¿Ì½«Êý¾Ý¾Ö²¿Ð´µ½ËüµÄÄÚ´æÖУ¬ºÍÔÚijһʱ¿Ì¾Ö²¿Ë¢ÐÂËüµÄÄÚ´æ¡£Ëü²»»áÔÙijһʱ¿Ì¶Á/дÕû¸ö»º´æ¡£Í¨³££¬ÔÚÒ»¸ö±»³Æ×÷¡°cache
lines¡±µÄ¸üСµÄÄÚ´æ¿éÖлº´æ±»¸üС£Ò»¸ö»òÕß¶à¸ö»º´æÐпÉÄܱ»¶Áµ½»º´æ£¬Ò»¸ö»òÕß¶à¸ö»º´æÐпÉÄÜÔÙ±»Ë¢Ð»ØÖ÷´æ¡£
JavaÄÚ´æÄ£ÐͺÍÓ²¼þÄÚ´æ¼Ü¹¹Ö®¼äµÄÇŽÓ
ÉÏÃæÒѾÌáµ½£¬JavaÄÚ´æÄ£ÐÍÓëÓ²¼þÄÚ´æ¼Ü¹¹Ö®¼ä´æÔÚ²îÒì¡£Ó²¼þÄÚ´æ¼Ü¹¹Ã»ÓÐÇø·ÖÏß³ÌÕ»ºÍ¶Ñ¡£¶ÔÓÚÓ²¼þ£¬ËùÓеÄÏß³ÌÕ»ºÍ¶Ñ¶¼·Ö²¼ÔÚÖ÷ÄÚÖС£²¿·ÖÏß³ÌÕ»ºÍ¶Ñ¿ÉÄÜÓÐʱºò»á³öÏÖÔÚCPU»º´æÖкÍCPUÄÚ²¿µÄ¼Ä´æÆ÷ÖС£ÈçÏÂͼËùʾ£º

µ±¶ÔÏóºÍ±äÁ¿±»´æ·ÅÔÚ¼ÆËã»úÖи÷ÖÖ²»Í¬µÄÄÚ´æÇøÓòÖÐʱ£¬¾Í¿ÉÄÜ»á³öÏÖһЩ¾ßÌåµÄÎÊÌâ¡£Ö÷Òª°üÀ¨ÈçÏÂÁ½¸ö·½Ã棺
Ï̶߳Թ²Ïí±äÁ¿Ð޸ĵĿɼûÐÔ
µ±¶Á£¬Ð´ºÍ¼ì²é¹²Ïí±äÁ¿Ê±³öÏÖrace conditions
ÏÂÃæÎÒÃÇרÃÅÀ´½âÊÍÒÔÏÂÕâÁ½¸öÎÊÌâ¡£
¹²Ïí¶ÔÏó¿É¼ûÐÔ
Èç¹ûÁ½¸ö»òÕ߸ü¶àµÄÏß³ÌÔÚûÓÐÕýÈ·µÄʹÓÃVolatileÉùÃ÷»òÕßͬ²½µÄÇé¿öϹ²ÏíÒ»¸ö¶ÔÏó£¬Ò»¸öÏ̸߳üÐÂÕâ¸ö¹²Ïí¶ÔÏó¿ÉÄÜ¶ÔÆäËüÏß³ÌÀ´ËµÊDz»½Ó¼ûµÄ¡£
ÏëÏóһϣ¬¹²Ïí¶ÔÏó±»³õʼ»¯ÔÚÖ÷´æÖС£ÅÜÔÚCPUÉϵÄÒ»¸öÏ߳̽«Õâ¸ö¹²Ïí¶ÔÏó¶Áµ½CPU»º´æÖС£È»ºóÐÞ¸ÄÁËÕâ¸ö¶ÔÏó¡£Ö»ÒªCPU»º´æÃ»Óб»Ë¢Ð»áÖ÷´æ£¬¶ÔÏóÐ޸ĺóµÄ°æ±¾¶ÔÅÜÔÚÆäËüCPUÉϵÄÏ̶߳¼ÊDz»¿É¼ûµÄ¡£ÕâÖÖ·½Ê½¿ÉÄܵ¼ÖÂÿ¸öÏß³ÌÓµÓÐÕâ¸ö¹²Ïí¶ÔÏóµÄ˽Óп½±´£¬Ã¿¸ö¿½±´Í£ÁôÔÚ²»Í¬µÄCPU»º´æÖС£
ÏÂͼʾÒâÁËÕâÖÖÇéÐΡ£ÅÜÔÚ×ó±ßCPUµÄÏ߳̿½±´Õâ¸ö¹²Ïí¶ÔÏóµ½ËüµÄCPU»º´æÖУ¬È»ºó½«count±äÁ¿µÄÖµÐÞ¸ÄΪ2¡£Õâ¸öÐ޸ĶÔÅÜÔÚÓÒ±ßCPUÉÏµÄÆäËüÏß³ÌÊDz»¿É¼ûµÄ£¬ÒòΪÐ޸ĺóµÄcountµÄÖµ»¹Ã»Óб»Ë¢Ð»ØÖ÷´æÖÐÈ¥¡£

½â¾öÕâ¸öÎÊÌâÄã¿ÉÒÔʹÓÃJavaÖеÄvolatile¹Ø¼ü×Ö¡£volatile¹Ø¼ü×Ö¿ÉÒÔ±£Ö¤Ö±½Ó´ÓÖ÷´æÖжÁȡһ¸ö±äÁ¿£¬Èç¹ûÕâ¸ö±äÁ¿±»Ð޸ĺó£¬×ÜÊǻᱻд»Øµ½Ö÷´æÖÐÈ¥¡£
Race Conditions
Èç¹ûÁ½¸ö»òÕ߸ü¶àµÄÏ̹߳²ÏíÒ»¸ö¶ÔÏ󣬶à¸öÏß³ÌÔÚÕâ¸ö¹²Ïí¶ÔÏóÉϸüбäÁ¿£¬¾ÍÓпÉÄÜ·¢Éúrace
conditions¡£
ÏëÏóһϣ¬Èç¹ûÏß³ÌA¶ÁÒ»¸ö¹²Ïí¶ÔÏóµÄ±äÁ¿countµ½ËüµÄCPU»º´æÖС£ÔÙÏëÏóһϣ¬Ïß³ÌBÒ²×öÁËͬÑùµÄÊÂÇ飬µ«ÊÇÍùÒ»¸ö²»Í¬µÄCPU»º´æÖС£ÏÖÔÚÏß³ÌA½«count¼Ó1£¬Ïß³ÌBÒ²×öÁËͬÑùµÄÊÂÇé¡£ÏÖÔÚcountÒѾ±»ÔöÔÚÁËÁ½¸ö£¬Ã¿¸öCPU»º´æÖÐÒ»´Î¡£
Èç¹ûÕâЩÔö¼Ó²Ù×÷±»Ë³ÐòµÄÖ´ÐУ¬±äÁ¿countÓ¦¸Ã±»Ôö¼ÓÁ½´Î£¬È»ºóÔÖµ+2±»Ð´»Øµ½Ö÷´æÖÐÈ¥¡£
È»¶ø£¬Á½´ÎÔö¼Ó¶¼ÊÇÔÚûÓÐÊʵ±µÄͬ²½Ï²¢·¢Ö´Ðеġ£ÎÞÂÛÊÇÏß³ÌA»¹ÊÇÏß³ÌB½«countÐ޸ĺóµÄ°æ±¾Ð´»Øµ½Ö÷´æÖÐÈ¡£¬Ð޸ĺóµÄÖµ½ö»á±»ÔÖµ´ó1£¬¾¡¹ÜÔö¼ÓÁËÁ½´Î¡£
ÏÂͼÑÝʾÁËÉÏÃæÃèÊöµÄÇé¿ö£º

½â¾öÕâ¸öÎÊÌâ¿ÉÒÔʹÓÃJavaͬ²½¿é¡£Ò»¸öͬ²½¿é¿ÉÒÔ±£Ö¤ÔÚͬһʱ¿Ì½öÓÐÒ»¸öÏ߳̿ÉÒÔ½øÈë´úÂëµÄÁÙ½çÇø¡£Í¬²½¿é»¹¿ÉÒÔ±£Ö¤´úÂë¿éÖÐËùÓб»·ÃÎʵıäÁ¿½«»á´ÓÖ÷´æÖжÁÈ룬µ±Ïß³ÌÍ˳öͬ²½´úÂë¿éʱ£¬ËùÓб»¸üеıäÁ¿¶¼»á±»Ë¢Ð»ØÖ÷´æÖÐÈ¥£¬²»¹ÜÕâ¸ö±äÁ¿ÊÇ·ñ±»ÉùÃ÷Ϊvolatile¡£ |