NOVOTS KMS ´Ê»ã±í Glossary    ÁªÏµÎÒÃÇ Contact Us
²éѯ Search  
   
°´Àà±ðä¯ÀÀ Browse by Category
NOVOTS KMS .: JAVAÓ¦Ó÷þÎñÆ÷ .: Java²¢·¢±à³Ì:´Ó¸ùÔ´ÉϽâÎövolatile¹Ø¼ü×ÖµÄʵÏÖ

Java²¢·¢±à³Ì:´Ó¸ùÔ´ÉϽâÎövolatile¹Ø¼ü×ÖµÄʵÏÖ

Java²¢·¢±à³Ì£ºvolatile¹Ø¼ü×Ö½âÎö 1¡¢½âÎö¸ÅÀÀ ÄÚ´æÄ£Ð͵ÄÏà¹Ø¸ÅÄî ²¢·¢±à³ÌÖеÄÈý¸ö¸ÅÄî JavaÄÚ´æÄ£ÐÍ ÉîÈëÆÊÎövolatile¹Ø¼ü×Ö Ê¹ÓÃvolatile¹Ø¼ü×ֵij¡¾° 2¡¢ÄÚ´æÄ£Ð͵ÄÏà¹Ø¸ÅÄî »º´æÒ»ÖÂÐÔÎÊÌ⡣ͨ³£³ÆÕâÖÖ±»¶à¸öÏ̷߳ÃÎʵıäÁ¿Îª¹²Ïí±äÁ¿¡£ Ò²¾ÍÊÇ˵£¬Èç¹ûÒ»¸ö±äÁ¿ÔÚ¶à¸öCPUÖж¼´æÔÚ»º´æ(Ò»°ãÔÚ¶àÏ̱߳à³Ìʱ²Å»á³öÏÖ)£¬ÄÇô¾Í¿ÉÄÜ´æÔÚ»º´æ²»Ò»ÖµÄÎÊÌâ¡£ ΪÁ˽â¾ö»º´æ²»Ò»ÖÂÐÔÎÊÌ⣬ͨ³£À´ËµÓÐÒÔÏÂ2ÖÖ½â¾ö·½·¨£º ͨ¹ýÔÚ×ÜÏß¼ÓLOCK#ËøµÄ·½Ê½ ͨ¹ý»º´æÒ»ÖÂÐÔЭÒé Õâ2ÖÖ·½Ê½¶¼ÊÇÓ²¼þ²ãÃæÉÏÌṩµÄ·½Ê½¡£ ÉÏÃæµÄ·½Ê½1»áÓÐÒ»¸öÎÊÌ⣬ÓÉÓÚÔÚËø×¡×ÜÏßÆÚ¼ä£¬ÆäËûCPUÎÞ·¨·ÃÎÊÄڴ棬µ¼ÖÂЧÂʵÍÏ¡£ »º´æÒ»ÖÂÐÔЭÒé¡£×î³öÃûµÄ¾ÍÊÇIntel µÄMESIЭÒ飬MESIЭÒé±£Ö¤ÁËÿ¸ö»º´æÖÐʹÓõĹ²Ïí±äÁ¿µÄ¸±±¾ÊÇÒ»Öµġ£ËüºËÐĵÄ˼ÏëÊÇ£ºµ±CPUдÊý¾Ýʱ£¬Èç¹û·¢ÏÖ²Ù×÷µÄ±äÁ¿Êǹ²Ïí±äÁ¿£¬¼´ÔÚÆäËûCPUÖÐÒ²´æÔڸñäÁ¿µÄ¸±±¾£¬»á·¢³öÐźÅ֪ͨÆäËûCPU½«¸Ã±äÁ¿µÄ»º´æÐÐÖÃΪÎÞЧ״̬£¬Òò´Ëµ±ÆäËûCPUÐèÒª¶ÁÈ¡Õâ¸ö±äÁ¿Ê±£¬·¢ÏÖ×Ô¼º»º´æÖлº´æ¸Ã±äÁ¿µÄ»º´æÐÐÊÇÎÞЧµÄ£¬ÄÇôËü¾Í»á´ÓÄÚ´æÖØÐ¶ÁÈ¡¡£ 3¡¢²¢·¢±à³ÌÖеÄÈý¸ö¸ÅÄî ÔÚ²¢·¢±à³ÌÖУ¬ÎÒÃÇͨ³£»áÓöµ½ÒÔÏÂÈý¸öÎÊÌ⣺ԭ×ÓÐÔÎÊÌ⣬¿É¼ûÐÔÎÊÌ⣬ÓÐÐòÐÔÎÊÌâ¡£ 3.1 Ô­×ÓÐÔ Ô­×ÓÐÔ£º¼´Ò»¸ö²Ù×÷»òÕß¶à¸ö²Ù×÷ Ҫôȫ²¿Ö´Ðв¢ÇÒÖ´ÐеĹý³Ì²»»á±»ÈκÎÒòËØ´ò¶Ï£¬ÒªÃ´¾Í¶¼²»Ö´ÐС£ 3.2 ¿É¼ûÐÔ ¿É¼ûÐÔÊÇÖ¸µ±¶à¸öÏ̷߳ÃÎÊͬһ¸ö±äÁ¿Ê±£¬Ò»¸öÏß³ÌÐÞ¸ÄÁËÕâ¸ö±äÁ¿µÄÖµ£¬ÆäËûÏß³ÌÄܹ»Á¢¼´¿´µÃµ½Ð޸ĵÄÖµ¡£ 3.3 ÓÐÐòÐÔ ÓÐÐòÐÔ£º¼´³ÌÐòÖ´ÐеÄ˳Ðò°´ÕÕ´úÂëµÄÏȺó˳ÐòÖ´ÐС£ ´Ó´úÂë˳ÐòÉÏ¿´£¬Óï¾ä1ÊÇÔÚÓï¾ä2Ç°ÃæµÄ£¬ÄÇôJVMÔÚÕæÕýÖ´ÐÐÕâ¶Î´úÂëµÄʱºò»á±£Ö¤Óï¾ä1Ò»¶¨»áÔÚÓï¾ä2Ç°ÃæÖ´ÐÐÂð?²»Ò»¶¨£¬ÎªÊ²Ã´ÄØ?ÕâÀï¿ÉÄܻᷢÉúÖ¸ÁîÖØÅÅÐò(Instruction Reorder)¡£ ÏÂÃæ½âÊÍÒ»ÏÂʲôÊÇÖ¸ÁîÖØÅÅÐò£¬Ò»°ãÀ´Ëµ£¬´¦ÀíÆ÷ΪÁËÌá¸ß³ÌÐòÔËÐÐЧÂÊ£¬¿ÉÄÜ»á¶ÔÊäÈë´úÂë½øÐÐÓÅ»¯£¬Ëü²»±£Ö¤³ÌÐòÖи÷¸öÓï¾äµÄÖ´ÐÐÏȺó˳Ðòͬ´úÂëÖеÄ˳ÐòÒ»Ö£¬µ«ÊÇËü»á±£Ö¤³ÌÐò×îÖÕÖ´Ðнá¹ûºÍ´úÂë˳ÐòÖ´ÐеĽá¹ûÊÇÒ»Öµġ£ Ö¸ÁîÖØÅÅÐò²»»áÓ°Ïìµ¥¸öÏ̵߳ÄÖ´ÐУ¬µ«ÊÇ»áÓ°Ïìµ½Ï̲߳¢·¢Ö´ÐеÄÕýÈ·ÐÔ¡£ Ò²¾ÍÊÇ˵£¬ÒªÏë²¢·¢³ÌÐòÕýÈ·µØÖ´ÐУ¬±ØÐëÒª±£Ö¤Ô­×ÓÐÔ¡¢¿É¼ûÐÔÒÔ¼°ÓÐÐòÐÔ¡£Ö»ÒªÓÐÒ»¸öûÓб»±£Ö¤£¬¾ÍÓпÉÄܻᵼÖ³ÌÐòÔËÐв»ÕýÈ·¡£ 4¡¢JavaÄÚ´æÄ£ÐÍ ÔÚJavaÐéÄâ»ú¹æ·¶ÖÐÊÔͼ¶¨ÒåÒ»ÖÖJavaÄÚ´æÄ£ÐÍ(Java Memory Model£¬JMM)À´ÆÁ±Î¸÷¸öÓ²¼þƽ̨ºÍ²Ù×÷ϵͳµÄÄÚ´æ·ÃÎʲîÒ죬ÒÔʵÏÖÈÃJava³ÌÐòÔÚ¸÷ÖÖÆ½Ì¨Ï¶¼ÄÜ´ïµ½Ò»ÖµÄÄÚ´æ·ÃÎÊЧ¹û¡£ÄÇôJavaÄÚ´æÄ£Ð͹涨ÁËÄÄЩ¶«Î÷ÄØ£¬Ëü¶¨ÒåÁ˳ÌÐòÖбäÁ¿µÄ·ÃÎʹæÔò£¬Íù´óÒ»µã˵ÊǶ¨ÒåÁ˳ÌÐòÖ´ÐеĴÎÐò¡£×¢Ò⣬ΪÁË»ñµÃ½ÏºÃµÄÖ´ÐÐÐÔÄÜ£¬JavaÄÚ´æÄ£ÐͲ¢Ã»ÓÐÏÞÖÆÖ´ÐÐÒýÇæÊ¹Óô¦ÀíÆ÷µÄ¼Ä´æÆ÷»òÕ߸ßËÙ»º´æÀ´ÌáÉýÖ¸ÁîÖ´ÐÐËÙ¶È£¬Ò²Ã»ÓÐÏÞÖÆ±àÒëÆ÷¶ÔÖ¸Áî½øÐÐÖØÅÅÐò¡£Ò²¾ÍÊÇ˵£¬ÔÚjavaÄÚ´æÄ£ÐÍÖУ¬Ò²»á´æÔÚ»º´æÒ»ÖÂÐÔÎÊÌâºÍÖ¸ÁîÖØÅÅÐòµÄÎÊÌâ¡£ JavaÄÚ´æÄ£Ð͹涨ËùÓеıäÁ¿¶¼ÊÇ´æÔÚÖ÷´æµ±ÖÐ(ÀàËÆÓÚÇ°ÃæËµµÄÎïÀíÄÚ´æ)£¬Ã¿¸öÏ̶߳¼ÓÐ×Ô¼ºµÄ¹¤×÷ÄÚ´æ(ÀàËÆÓÚÇ°ÃæµÄ¸ßËÙ»º´æ)¡£Ï̶߳ԱäÁ¿µÄËùÓвÙ×÷¶¼±ØÐëÔÚ¹¤×÷ÄÚ´æÖнøÐУ¬¶ø²»ÄÜÖ±½Ó¶ÔÖ÷´æ½øÐвÙ×÷¡£²¢ÇÒÿ¸öÏ̲߳»ÄÜ·ÃÎÊÆäËûÏ̵߳Ť×÷ÄÚ´æ¡£ 4.1 Ô­×ÓÐÔ ÔÚJavaÖУ¬¶Ô»ù±¾Êý¾ÝÀàÐ͵ıäÁ¿µÄ¶ÁÈ¡ºÍ¸³Öµ²Ù×÷ÊÇÔ­×ÓÐÔ²Ù×÷£¬¼´ÕâЩ²Ù×÷ÊDz»¿É±»Öжϵģ¬ÒªÃ´Ö´ÐУ¬ÒªÃ´²»Ö´ÐС£ Çë·ÖÎöÒÔÏÂÄÄЩ²Ù×÷ÊÇÔ­×ÓÐÔ²Ù×÷£º x = 10; //Óï¾ä1 y = x; //Óï¾ä2 x++; //Óï¾ä3 x = x + 1; //Óï¾ä4 ÆäʵֻÓÐÓï¾ä1ÊÇÔ­×ÓÐÔ²Ù×÷£¬ÆäËûÈý¸öÓï¾ä¶¼²»ÊÇÔ­×ÓÐÔ²Ù×÷¡£ Ò²¾ÍÊÇ˵£¬Ö»Óмòµ¥µÄ¶ÁÈ¡¡¢¸³Öµ(¶øÇÒ±ØÐëÊǽ«Êý×Ö¸³Öµ¸øÄ³¸ö±äÁ¿£¬±äÁ¿Ö®¼äµÄÏ໥¸³Öµ²»ÊÇÔ­×Ó²Ù×÷)²ÅÊÇÔ­×Ó²Ù×÷¡£ ´ÓÉÏÃæ¿ÉÒÔ¿´³ö£¬JavaÄÚ´æÄ£ÐÍÖ»±£Ö¤ÁË»ù±¾¶ÁÈ¡ºÍ¸³ÖµÊÇÔ­×ÓÐÔ²Ù×÷£¬Èç¹ûҪʵÏÖ¸ü´ó·¶Î§²Ù×÷µÄÔ­×ÓÐÔ£¬¿ÉÒÔͨ¹ýsynchronizedºÍLockÀ´ÊµÏÖ¡£ 4.2 ¿É¼ûÐÔ ¶ÔÓڿɼûÐÔ£¬JavaÌṩÁËvolatile¹Ø¼ü×ÖÀ´±£Ö¤¿É¼ûÐÔ¡£ µ±Ò»¸ö¹²Ïí±äÁ¿±»volatileÐÞÊÎʱ£¬Ëü»á±£Ö¤Ð޸ĵÄÖµ»áÁ¢¼´±»¸üе½Ö÷´æ£¬µ±ÓÐÆäËûÏß³ÌÐèÒª¶Áȡʱ£¬Ëü»áÈ¥ÄÚ´æÖжÁÈ¡ÐÂÖµ¡£ ¶øÆÕͨµÄ¹²Ïí±äÁ¿²»Äܱ£Ö¤¿É¼ûÐÔ£¬ÒòΪÆÕͨ¹²Ïí±äÁ¿±»ÐÞ¸ÄÖ®ºó£¬Ê²Ã´Ê±ºò±»Ð´ÈëÖ÷´æÊDz»È·¶¨µÄ£¬µ±ÆäËûÏß³ÌÈ¥¶Áȡʱ£¬´ËʱÄÚ´æÖпÉÄÜ»¹ÊÇÔ­À´µÄ¾ÉÖµ£¬Òò´ËÎÞ·¨±£Ö¤¿É¼ûÐÔ¡£ ÁíÍ⣬ͨ¹ýsynchronizedºÍLockÒ²Äܹ»±£Ö¤¿É¼ûÐÔ£¬synchronizedºÍLockÄܱ£Ö¤Í¬Ò»Ê±¿ÌÖ»ÓÐÒ»¸öÏ̻߳ñÈ¡ËøÈ»ºóÖ´ÐÐͬ²½´úÂ룬²¢ÇÒÔÚÊÍ·ÅËøÖ®Ç°»á½«¶Ô±äÁ¿µÄÐÞ¸Äˢе½Ö÷´æµ±ÖС£Òò´Ë¿ÉÒÔ±£Ö¤¿É¼ûÐÔ¡£ 4.3 ÓÐÐòÐÔ ÔÚJavaÄÚ´æÄ£ÐÍÖУ¬ÔÊÐí±àÒëÆ÷ºÍ´¦ÀíÆ÷¶ÔÖ¸Áî½øÐÐÖØÅÅÐò£¬µ«ÊÇÖØÅÅÐò¹ý³Ì²»»áÓ°Ïìµ½µ¥Ï̳߳ÌÐòµÄÖ´ÐУ¬È´»áÓ°Ïìµ½¶àÏ̲߳¢·¢Ö´ÐеÄÕýÈ·ÐÔ¡£ ÔÚJavaÀïÃæ£¬¿ÉÒÔͨ¹ývolatile¹Ø¼ü×ÖÀ´±£Ö¤Ò»¶¨µÄ¡°ÓÐÐòÐÔ¡±(ËüÄܽûÖ¹½øÐÐÖ¸ÁîÖØÅÅÐò)¡£ÁíÍâ¿ÉÒÔͨ¹ýsynchronizedºÍLockÀ´±£Ö¤ÓÐÐòÐÔ£¬ºÜÏÔÈ»£¬synchronizedºÍLock±£Ö¤Ã¿¸öʱ¿ÌÊÇÓÐÒ»¸öÏß³ÌÖ´ÐÐͬ²½´úÂ룬Ï൱ÓÚÊÇÈÃÏß³Ì˳ÐòÖ´ÐÐͬ²½´úÂ룬×ÔÈ»¾Í±£Ö¤ÁËÓÐÐòÐÔ¡£ ÁíÍ⣬JavaÄÚ´æÄ£Ð;߱¸Ò»Ð©ÏÈÌìµÄ¡°ÓÐÐòÐÔ¡±£¬¼´²»ÐèҪͨ¹ýÈκÎÊֶξÍÄܹ»µÃµ½±£Ö¤µÄÓÐÐòÐÔ£¬Õâ¸öͨ³£Ò²³ÆÎª happens-before Ô­Ôò¡£Èç¹ûÁ½¸ö²Ù×÷µÄÖ´ÐдÎÐòÎÞ·¨´Óhappens-beforeÔ­ÔòÍÆµ¼³öÀ´£¬ÄÇôËüÃǾͲ»Äܱ£Ö¤ËüÃǵÄÓÐÐòÐÔ£¬ÐéÄâ»ú¿ÉÒÔËæÒâµØ¶ÔËüÃǽøÐÐÖØÅÅÐò¡£ ÏÂÃæ¾ÍÀ´¾ßÌå½éÉÜÏÂhappens-beforeÔ­Ôò(ÏÈÐз¢ÉúÔ­Ôò)£º ³ÌÐò´ÎÐò¹æÔò£ºÒ»¸öÏß³ÌÄÚ£¬°´ÕÕ´úÂë˳Ðò£¬ÊéдÔÚÇ°ÃæµÄ²Ù×÷ÏÈÐз¢ÉúÓÚÊéдÔÚºóÃæµÄ²Ù×÷ Ëø¶¨¹æÔò£ºÒ»¸öunLock²Ù×÷ÏÈÐз¢ÉúÓÚºóÃæ¶Ôͬһ¸öËø¶îlock²Ù×÷ volatile±äÁ¿¹æÔò£º¶ÔÒ»¸ö±äÁ¿µÄд²Ù×÷ÏÈÐз¢ÉúÓÚºóÃæ¶ÔÕâ¸ö±äÁ¿µÄ¶Á²Ù×÷ ´«µÝ¹æÔò£ºÈç¹û²Ù×÷AÏÈÐз¢ÉúÓÚ²Ù×÷B£¬¶ø²Ù×÷BÓÖÏÈÐз¢ÉúÓÚ²Ù×÷C£¬Ôò¿ÉÒԵóö²Ù×÷AÏÈÐз¢ÉúÓÚ²Ù×÷C Ïß³ÌÆô¶¯¹æÔò£ºThread¶ÔÏóµÄstart()·½·¨ÏÈÐз¢ÉúÓÚ´ËÏ̵߳Äÿ¸öÒ»¸ö¶¯×÷ Ïß³ÌÖжϹæÔò£º¶ÔÏß³Ìinterrupt()·½·¨µÄµ÷ÓÃÏÈÐз¢ÉúÓÚ±»ÖжÏÏ̵߳ĴúÂë¼ì²âµ½ÖжÏʼþµÄ·¢Éú Ïß³ÌÖÕ½á¹æÔò£ºÏß³ÌÖÐËùÓеIJÙ×÷¶¼ÏÈÐз¢ÉúÓÚÏ̵߳ÄÖÕÖ¹¼ì²â£¬ÎÒÃÇ¿ÉÒÔͨ¹ýThread.join()·½·¨½áÊø¡¢Thread.isAlive()µÄ·µ»ØÖµÊֶμì²âµ½Ïß³ÌÒѾ­ÖÕÖ¹Ö´ÐÐ ¶ÔÏóÖÕ½á¹æÔò£ºÒ»¸ö¶ÔÏóµÄ³õʼ»¯Íê³ÉÏÈÐз¢ÉúÓÚËûµÄfinalize()·½·¨µÄ¿ªÊ¼ Õâ8Ìõ¹æÔòÖУ¬Ç°4Ìõ¹æÔòÊDZȽÏÖØÒªµÄ£¬ºó4Ìõ¹æÔò¶¼ÊÇÏÔ¶øÒ×¼ûµÄ¡£ ÏÂÃæÎÒÃÇÀ´½âÊÍÒ»ÏÂǰ4Ìõ¹æÔò£º ¶ÔÓÚ³ÌÐò´ÎÐò¹æÔòÀ´Ëµ£¬ÎÒµÄÀí½â¾ÍÊÇÒ»¶Î³ÌÐò´úÂëµÄÖ´ÐÐÔÚµ¥¸öÏß³ÌÖп´ÆðÀ´ÊÇÓÐÐòµÄ¡£×¢Ò⣬ËäÈ»ÕâÌõ¹æÔòÖÐÌáµ½¡°ÊéдÔÚÇ°ÃæµÄ²Ù×÷ÏÈÐз¢ÉúÓÚÊéдÔÚºóÃæµÄ²Ù×÷¡±£¬Õâ¸öÓ¦¸ÃÊdzÌÐò¿´ÆðÀ´Ö´ÐеÄ˳ÐòÊǰ´ÕÕ´úÂë˳ÐòÖ´Ðеģ¬ÒòΪÐéÄâ»ú¿ÉÄÜ»á¶Ô³ÌÐò´úÂë½øÐÐÖ¸ÁîÖØÅÅÐò¡£ËäÈ»½øÐÐÖØÅÅÐò£¬µ«ÊÇ×îÖÕÖ´ÐеĽá¹ûÊÇÓë³ÌÐò˳ÐòÖ´ÐеĽá¹ûÒ»Öµģ¬ËüÖ»»á¶Ô²»´æÔÚÊý¾ÝÒÀÀµÐÔµÄÖ¸Áî½øÐÐÖØÅÅÐò¡£Òò´Ë£¬ÔÚµ¥¸öÏß³ÌÖУ¬³ÌÐòÖ´Ðп´ÆðÀ´ÊÇÓÐÐòÖ´Ðеģ¬ÕâÒ»µãҪעÒâÀí½â¡£ÊÂʵÉÏ£¬Õâ¸ö¹æÔòÊÇÓÃÀ´±£Ö¤³ÌÐòÔÚµ¥Ïß³ÌÖÐÖ´Ðнá¹ûµÄÕýÈ·ÐÔ£¬µ«ÎÞ·¨±£Ö¤³ÌÐòÔÚ¶àÏß³ÌÖÐÖ´ÐеÄÕýÈ·ÐÔ¡£ µÚ¶þÌõ¹æÔòÒ²±È½ÏÈÝÒ×Àí½â£¬Ò²¾ÍÊÇ˵ÎÞÂÛÔÚµ¥Ïß³ÌÖл¹ÊǶàÏß³ÌÖУ¬Í¬Ò»¸öËøÈç¹û³öÓÚ±»Ëø¶¨µÄ״̬£¬ÄÇô±ØÐëÏȶÔËø½øÐÐÁËÊͷŲÙ×÷£¬ºóÃæ²ÅÄܼÌÐø½øÐÐlock²Ù×÷¡£ µÚÈýÌõ¹æÔòÊÇÒ»Ìõ±È½ÏÖØÒªµÄ¹æÔò£¬Ò²ÊǺóÎĽ«ÒªÖص㽲ÊöµÄÄÚÈÝ¡£Ö±¹ÛµØ½âÊ;ÍÊÇ£¬Èç¹ûÒ»¸öÏß³ÌÏÈȥдһ¸ö±äÁ¿£¬È»ºóÒ»¸öÏß³ÌÈ¥½øÐжÁÈ¡£¬ÄÇôдÈë²Ù×÷¿Ï¶¨»áÏÈÐз¢ÉúÓÚ¶Á²Ù×÷¡£ µÚËÄÌõ¹æÔòʵ¼ÊÉϾÍÊÇÌåÏÖhappens-beforeÔ­Ôò¾ß±¸´«µÝÐÔ¡£ 5¡¢ÉîÈëÆÊÎövolatile¹Ø¼ü×Ö 5.1 Volatile¹Ø¼ü×ÖµÄÁ½²ãÓïÒå Ò»µ©Ò»¸ö¹²Ïí±äÁ¿(ÀàµÄ³ÉÔ±±äÁ¿¡¢ÀàµÄ¾²Ì¬³ÉÔ±±äÁ¿)±»volatileÐÞÊÎÖ®ºó£¬ÄÇô¾Í¾ß±¸ÁËÁ½²ãÓïÒ壺 ±£Ö¤Á˲»Í¬Ï̶߳ÔÕâ¸ö±äÁ¿½øÐвÙ×÷ʱµÄ¿É¼ûÐÔ£¬¼´Ò»¸öÏß³ÌÐÞ¸ÄÁËij¸ö±äÁ¿µÄÖµ£¬ÕâÐÂÖµ¶ÔÆäËûÏß³ÌÀ´ËµÊÇÁ¢¼´¿É¼ûµÄ¡£ ½ûÖ¹½øÐÐÖ¸ÁîÖØÅÅÐò¡£ ¹ØÓڿɼûÐÔ£¬ÏÈ¿´Ò»¶Î´úÂ룬¼ÙÈçÏß³Ì1ÏÈÖ´ÐУ¬Ïß³Ì2ºóÖ´ÐУº //Ïß³Ì1 boolean stop = false; while(!stop){ doSomething(); } //Ïß³Ì2 stop = true; Õâ¶Î´úÂëÊǺܵäÐ͵ÄÒ»¶Î´úÂ룬ºÜ¶àÈËÔÚÖжÏÏß³Ìʱ¿ÉÄܶ¼»á²ÉÓÃÕâÖÖ±ê¼Ç°ì·¨¡£µ«ÊÇÊÂʵÉÏ£¬Õâ¶Î´úÂë»áÍêÈ«ÔËÐÐÕýȷô?¼´Ò»¶¨»á½«Ïß³ÌÖжÏô?²»Ò»¶¨£¬Ò²ÐíÔÚ´ó¶àÊýʱºò£¬Õâ¸ö´úÂëÄܹ»°ÑÏß³ÌÖжϣ¬µ«ÊÇÒ²ÓпÉÄܻᵼÖÂÎÞ·¨ÖжÏÏß³Ì(ËäÈ»Õâ¸ö¿ÉÄÜÐÔºÜС£¬µ«ÊÇÖ»ÒªÒ»µ©·¢ÉúÕâÖÖÇé¿ö¾Í»áÔì³ÉËÀÑ­»·ÁË)¡£ ÏÂÃæ½âÊÍÒ»ÏÂÕâ¶Î´úÂëΪºÎÓпÉÄܵ¼ÖÂÎÞ·¨ÖжÏÏ̡߳£ÔÚÇ°ÃæÒѾ­½âÊ͹ý£¬Ã¿¸öÏß³ÌÔÚÔËÐйý³ÌÖж¼ÓÐ×Ô¼ºµÄ¹¤×÷Äڴ棬ÄÇôÏß³Ì1ÔÚÔËÐеÄʱºò£¬»á½«stop±äÁ¿µÄÖµ¿½±´Ò»·Ý·ÅÔÚ×Ô¼ºµÄ¹¤×÷ÄÚ´æµ±ÖС£ ÄÇôµ±Ïß³Ì2¸ü¸ÄÁËstop±äÁ¿µÄÖµÖ®ºó£¬µ«ÊÇ»¹Ã»À´µÃ¼°Ð´ÈëÖ÷´æµ±ÖУ¬Ïß³Ì2תȥ×öÆäËûÊÂÇéÁË£¬ÄÇôÏß³Ì1ÓÉÓÚ²»ÖªµÀÏß³Ì2¶Ôstop±äÁ¿µÄ¸ü¸Ä£¬Òò´Ë»¹»áһֱѭ»·ÏÂÈ¥¡£ µ«ÊÇÓÃvolatileÐÞÊÎÖ®ºó¾Í±äµÃ²»Ò»ÑùÁË£º µÚÒ»£ºÊ¹ÓÃvolatile¹Ø¼ü×Ö»áÇ¿ÖÆ½«Ð޸ĵÄÖµÁ¢¼´Ð´ÈëÖ÷´æ; µÚ¶þ£ºÊ¹ÓÃvolatile¹Ø¼ü×ֵϰ£¬µ±Ïß³Ì2½øÐÐÐÞ¸Äʱ£¬»áµ¼ÖÂÏß³Ì1µÄ¹¤×÷ÄÚ´æÖлº´æ±äÁ¿stopµÄ»º´æÐÐÎÞЧ(·´Ó³µ½Ó²¼þ²ãµÄ»°£¬¾ÍÊÇCPUµÄL1»òÕßL2»º´æÖжÔÓ¦µÄ»º´æÐÐÎÞЧ); µÚÈý£ºÓÉÓÚÏß³Ì1µÄ¹¤×÷ÄÚ´æÖлº´æ±äÁ¿stopµÄ»º´æÐÐÎÞЧ£¬ËùÒÔÏß³Ì1ÔٴζÁÈ¡±äÁ¿stopµÄֵʱ»áÈ¥Ö÷´æ¶ÁÈ¡¡£ ÄÇôÔÚÏß³Ì2ÐÞ¸Ästopֵʱ(µ±È»ÕâÀï°üÀ¨2¸ö²Ù×÷£¬ÐÞ¸ÄÏß³Ì2¹¤×÷ÄÚ´æÖеÄÖµ£¬È»ºó½«Ð޸ĺóµÄֵдÈëÄÚ´æ)£¬»áʹµÃÏß³Ì1µÄ¹¤×÷ÄÚ´æÖлº´æ±äÁ¿stopµÄ»º´æÐÐÎÞЧ£¬È»ºóÏß³Ì1¶Áȡʱ£¬·¢ÏÖ×Ô¼ºµÄ»º´æÐÐÎÞЧ£¬Ëü»áµÈ´ý»º´æÐжÔÓ¦µÄÖ÷´æµØÖ·±»¸üÐÂÖ®ºó£¬È»ºóÈ¥¶ÔÓ¦µÄÖ÷´æ¶ÁÈ¡×îеÄÖµ¡£ ÄÇôÏß³Ì1¶ÁÈ¡µ½µÄ¾ÍÊÇ×îеÄÕýÈ·µÄÖµ¡£ 5.2 volatile±£Ö¤Ô­×ÓÐÔÂð? volatile²»±£Ö¤Ô­×ÓÐÔ£¬ÏÂÃæ¿´Ò»¸öʵÀý¡£ public class Test { public volatile int inc = 0; public void increase() { inc++; } public static void main(String[] args) { final Test test = new Test(); for(int i=0;i<10;i++){ new Thread(){ public void run() { for(int j=0;j<1000;j++) test.increase(); }; }.start(); } while(Thread.activeCount()>1) //±£Ö¤Ç°ÃæµÄÏ̶߳¼Ö´ÐÐÍê Thread.yield(); System.out.println(test.inc); } } ´ó¼ÒÏëÒ»ÏÂÕâ¶Î³ÌÐòµÄÊä³ö½á¹ûÊǶàÉÙ?Ò²ÐíÓÐЩÅóÓÑÈÏΪÊÇ10000¡£µ«ÊÇÊÂʵÉÏÔËÐÐËü»á·¢ÏÖÿ´ÎÔËÐнá¹û¶¼²»Ò»Ö£¬¶¼ÊÇÒ»¸öСÓÚ10000µÄÊý×Ö¡£ ÕâÀïÃæ¾ÍÓÐÒ»¸öÎóÇøÁË£¬volatile¹Ø¼ü×ÖÄܱ£Ö¤¿É¼ûÐÔûÓÐ´í£¬µ«ÊÇÉÏÃæµÄ³ÌÐò´íÔÚûÄܱ£Ö¤Ô­×ÓÐÔ¡£¿É¼ûÐÔÖ»Äܱ£Ö¤Ã¿´Î¶ÁÈ¡µÄÊÇ×îеÄÖµ£¬µ«ÊÇvolatileû°ì·¨±£Ö¤¶Ô±äÁ¿µÄ²Ù×÷µÄÔ­×ÓÐÔ¡£ ÔÚÇ°ÃæÒѾ­Ìáµ½¹ý£¬×ÔÔö²Ù×÷ÊDz»¾ß±¸Ô­×ÓÐԵģ¬Ëü°üÀ¨¶ÁÈ¡±äÁ¿µÄԭʼֵ¡¢½øÐмÓ1²Ù×÷¡¢Ð´È빤×÷ÄÚ´æ¡£ÄÇô¾ÍÊÇ˵×ÔÔö²Ù×÷µÄÈý¸ö×Ó²Ù×÷¿ÉÄÜ»á·Ö¸î¿ªÖ´ÐУ¬¾ÍÓпÉÄܵ¼ÖÂÏÂÃæÕâÖÖÇé¿ö³öÏÖ£º ¼ÙÈçij¸öʱ¿Ì±äÁ¿incµÄֵΪ10¡£ Ïß³Ì1¶Ô±äÁ¿½øÐÐ×ÔÔö²Ù×÷£¬Ïß³Ì1ÏȶÁÈ¡Á˱äÁ¿incµÄԭʼֵ£¬È»ºóÏß³Ì1±»×èÈûÁË; È»ºóÏß³Ì2¶Ô±äÁ¿½øÐÐ×ÔÔö²Ù×÷£¬Ïß³Ì2Ҳȥ¶ÁÈ¡±äÁ¿incµÄԭʼֵ£¬ÓÉÓÚÏß³Ì1Ö»ÊǶԱäÁ¿inc½øÐжÁÈ¡²Ù×÷£¬¶øÃ»ÓжԱäÁ¿½øÐÐÐ޸IJÙ×÷£¬ËùÒÔ²»»áµ¼ÖÂÏß³Ì2µÄ¹¤×÷ÄÚ´æÖлº´æ±äÁ¿incµÄ»º´æÐÐÎÞЧ£¬ËùÒÔÏß³Ì2»áÖ±½ÓÈ¥Ö÷´æ¶ÁÈ¡incµÄÖµ£¬·¢ÏÖincµÄֵʱ10£¬È»ºó½øÐмÓ1²Ù×÷£¬²¢°Ñ11дÈ빤×÷Äڴ棬×îºóдÈëÖ÷´æ¡£ È»ºóÏß³Ì1½Ó׎øÐмÓ1²Ù×÷£¬ÓÉÓÚÒѾ­¶ÁÈ¡ÁËincµÄÖµ£¬×¢Òâ´ËʱÔÚÏß³Ì1µÄ¹¤×÷ÄÚ´æÖÐincµÄÖµÈÔȻΪ10£¬ËùÒÔÏß³Ì1¶Ôinc½øÐмÓ1²Ù×÷ºóincµÄֵΪ11£¬È»ºó½«11дÈ빤×÷Äڴ棬×îºóдÈëÖ÷´æ¡£ ÄÇôÁ½¸öÏ̷ֱ߳ð½øÐÐÁËÒ»´Î×ÔÔö²Ù×÷ºó£¬incÖ»Ôö¼ÓÁË1¡£ ½âÊ͵½ÕâÀ¿ÉÄÜÓÐÅóÓÑ»áÓÐÒÉÎÊ£¬²»¶Ô°¡£¬Ç°Ãæ²»ÊDZ£Ö¤Ò»¸ö±äÁ¿ÔÚÐÞ¸Ävolatile±äÁ¿Ê±£¬»áÈûº´æÐÐÎÞЧÂð?È»ºóÆäËûÏß³ÌÈ¥¶Á¾Í»á¶Áµ½ÐµÄÖµ£¬¶Ô£¬Õâ¸öû´í¡£Õâ¸ö¾ÍÊÇÉÏÃæµÄhappens-before¹æÔòÖеÄvolatile±äÁ¿¹æÔò£¬µ«ÊÇҪעÒ⣬Ïß³Ì1¶Ô±äÁ¿½øÐжÁÈ¡²Ù×÷Ö®ºó£¬±»×èÈûÁ˵ϰ£¬²¢Ã»ÓжÔincÖµ½øÐÐÐ޸ġ£È»ºóËäÈ»volatileÄܱ£Ö¤Ïß³Ì2¶Ô±äÁ¿incµÄÖµ¶ÁÈ¡ÊÇ´ÓÄÚ´æÖжÁÈ¡µÄ£¬µ«ÊÇÏß³Ì1ûÓнøÐÐÐ޸ģ¬ËùÒÔÏß³Ì2¸ù±¾¾Í²»»á¿´µ½Ð޸ĵÄÖµ¡£ ¸ùÔ´¾ÍÔÚÕâÀ×ÔÔö²Ù×÷²»ÊÇÔ­×ÓÐÔ²Ù×÷£¬¶øÇÒvolatileÒ²ÎÞ·¨±£Ö¤¶Ô±äÁ¿µÄÈκβÙ×÷¶¼ÊÇÔ­×ÓÐԵġ£ °ÑÉÏÃæµÄ´úÂë¸Ä³ÉÒÔÏÂÈκÎÒ»ÖÖ¶¼¿ÉÒԴﵽЧ¹û£º ²ÉÓÃsynchronized£º public class Test { public int inc = 0; public synchronized void increase() { inc++; } public static void main(String[] args) { final Test test = new Test(); for(int i=0;i<10;i++){ new Thread(){ public void run() { for(int j=0;j<1000;j++) test.increase(); }; }.start(); } while(Thread.activeCount()>1) //±£Ö¤Ç°ÃæµÄÏ̶߳¼Ö´ÐÐÍê Thread.yield(); System.out.println(test.inc); } } ²ÉÓÃLock£º public class Test { public int inc = 0; Lock lock = new ReentrantLock(); public void increase() { lock.lock(); try { inc++; } finally{ lock.unlock(); } } public static void main(String[] args) { final Test test = new Test(); for(int i=0;i<10;i++){ new Thread(){ public void run() { for(int j=0;j<1000;j++) test.increase(); }; }.start(); } while(Thread.activeCount()>1) //±£Ö¤Ç°ÃæµÄÏ̶߳¼Ö´ÐÐÍê Thread.yield(); System.out.println(test.inc); } } ²ÉÓÃAtomicInteger£º public class Test { public AtomicInteger inc = new AtomicInteger(); public void increase() { inc.getAndIncrement(); } public static void main(String[] args) { final Test test = new Test(); for(int i=0;i<10;i++){ new Thread(){ public void run() { for(int j=0;j<1000;j++) test.increase(); }; }.start(); } while(Thread.activeCount()>1) //±£Ö¤Ç°ÃæµÄÏ̶߳¼Ö´ÐÐÍê Thread.yield(); System.out.println(test.inc); } } ÔÚjava 1.5µÄjava.util.concurrent.atomic°üÏÂÌṩÁËһЩԭ×Ó²Ù×÷À࣬¼´¶Ô»ù±¾Êý¾ÝÀàÐ굀 ×ÔÔö(¼Ó1²Ù×÷)£¬×Ô¼õ(¼õ1²Ù×÷)¡¢ÒÔ¼°¼Ó·¨²Ù×÷(¼ÓÒ»¸öÊý)£¬¼õ·¨²Ù×÷(¼õÒ»¸öÊý)½øÐÐÁË·â×°£¬±£Ö¤ÕâЩ²Ù×÷ÊÇÔ­×ÓÐÔ²Ù×÷¡£atomicÊÇÀûÓÃCASÀ´ÊµÏÖÔ­×ÓÐÔ²Ù×÷µÄ(Compare And Swap)£¬CASʵ¼ÊÉÏÊÇÀûÓô¦ÀíÆ÷ÌṩµÄCMPXCHGÖ¸ÁîʵÏֵ쬶ø´¦ÀíÆ÷Ö´ÐÐCMPXCHGÖ¸ÁîÊÇÒ»¸öÔ­×ÓÐÔ²Ù×÷¡£ 5.3 volatileÄܱ£Ö¤ÓÐÐòÐÔÂð? volatileÄÜÔÚÒ»¶¨³Ì¶ÈÉϱ£Ö¤ÓÐÐòÐÔ¡£ volatile¹Ø¼ü×Ö½ûÖ¹Ö¸ÁîÖØÅÅÐòÓÐÁ½²ãÒâ˼£º 1)µ±³ÌÐòÖ´Ðе½volatile±äÁ¿µÄ¶Á²Ù×÷»òÕßд²Ù×÷ʱ£¬ÔÚÆäÇ°ÃæµÄ²Ù×÷µÄ¸ü¸Ä¿Ï¶¨È«²¿ÒѾ­½øÐУ¬ÇÒ½á¹ûÒѾ­¶ÔºóÃæµÄ²Ù×÷¿É¼û;ÔÚÆäºóÃæµÄ²Ù×÷¿Ï¶¨»¹Ã»ÓнøÐÐ; 2)ÔÚ½øÐÐÖ¸ÁîÓÅ»¯Ê±£¬²»Äܽ«ÔÚ¶Ôvolatile±äÁ¿·ÃÎʵÄÓï¾ä·ÅÔÚÆäºóÃæÖ´ÐУ¬Ò²²»ÄܰÑvolatile±äÁ¿ºóÃæµÄÓï¾ä·Åµ½ÆäÇ°ÃæÖ´ÐС£ ¾Ù¸öÀý×Ó£º //x¡¢yΪ·Çvolatile±äÁ¿ //flagΪvolatile±äÁ¿ x = 2; //Óï¾ä1 y = 0; //Óï¾ä2 flag = true; //Óï¾ä3 x = 4; //Óï¾ä4 y = -1; //Óï¾ä5 ÓÉÓÚflag±äÁ¿Îªvolatile±äÁ¿£¬ÄÇôÔÚ½øÐÐÖ¸ÁîÖØÅÅÐòµÄ¹ý³ÌµÄʱºò£¬²»»á½«Óï¾ä3·Åµ½Óï¾ä1¡¢Óï¾ä2Ç°Ãæ£¬Ò²²»»á½²Óï¾ä3·Åµ½Óï¾ä4¡¢Óï¾ä5ºóÃæ¡£µ«ÊÇҪעÒâÓï¾ä1ºÍÓï¾ä2µÄ˳Ðò¡¢Óï¾ä4ºÍÓï¾ä5µÄ˳ÐòÊDz»×÷Èκα£Ö¤µÄ¡£ ²¢ÇÒvolatile¹Ø¼ü×ÖÄܱ£Ö¤£¬Ö´Ðе½Óï¾ä3ʱ£¬Óï¾ä1ºÍÓï¾ä2±Ø¶¨ÊÇÖ´ÐÐÍê±ÏÁ˵ģ¬ÇÒÓï¾ä1ºÍÓï¾ä2µÄÖ´Ðнá¹û¶ÔÓï¾ä3¡¢Óï¾ä4¡¢Óï¾ä5ÊǿɼûµÄ¡£ 5.4 volatileµÄÔ­ÀíºÍʵÏÖ»úÖÆ ÕâÀï̽ÌÖÒ»ÏÂvolatileµ½µ×ÈçºÎ±£Ö¤¿É¼ûÐԺͽûÖ¹Ö¸ÁîÖØÅÅÐòµÄ¡£ ÏÂÃæÕâ¶Î»°Õª×Ô¡¶ÉîÈëÀí½âJavaÐéÄâ»ú¡·£º ¡°¹Û²ì¼ÓÈëvolatile¹Ø¼ü×ÖºÍûÓмÓÈëvolatile¹Ø¼ü×ÖʱËùÉú³ÉµÄ»ã±à´úÂë·¢ÏÖ£¬¼ÓÈëvolatile¹Ø¼ü×Öʱ£¬»á¶à³öÒ»¸ölockǰ׺ָÁ lockǰ׺ָÁîʵ¼ÊÉÏÏ൱ÓÚÒ»¸öÄÚ´æÆÁÕÏ(Ò²³ÉÄÚ´æÕ¤À¸)£¬ÄÚ´æÆÁÕÏ»áÌṩ3¸ö¹¦ÄÜ£º ËüÈ·±£Ö¸ÁîÖØÅÅÐòʱ²»»á°ÑÆäºóÃæµÄÖ¸ÁîÅŵ½ÄÚ´æÆÁÕÏ֮ǰµÄλÖã¬Ò²²»»á°ÑÇ°ÃæµÄÖ¸ÁîÅŵ½ÄÚ´æÆÁÕϵĺóÃæ;¼´ÔÚÖ´Ðе½ÄÚ´æÆÁÕÏÕâ¾äÖ¸Áîʱ£¬ÔÚËüÇ°ÃæµÄ²Ù×÷ÒѾ­È«²¿Íê³É; Ëü»áÇ¿ÖÆ½«¶Ô»º´æµÄÐ޸IJÙ×÷Á¢¼´Ð´ÈëÖ÷´æ; Èç¹ûÊÇд²Ù×÷£¬Ëü»áµ¼ÖÂÆäËûCPUÖжÔÓ¦µÄ»º´æÐÐÎÞЧ¡£ 6¡¢Ê¹ÓÃvolatile¹Ø¼ü×ֵij¡¾° synchronized¹Ø¼ü×ÖÊÇ·ÀÖ¹¶à¸öÏß³ÌͬʱִÐÐÒ»¶Î´úÂ룬ÄÇô¾Í»áºÜÓ°Ïì³ÌÐòÖ´ÐÐЧÂÊ£¬¶øvolatile¹Ø¼ü×ÖÔÚijЩÇé¿öÏÂÐÔÄÜÒªÓÅÓÚsynchronized£¬µ«ÊÇҪעÒâvolatile¹Ø¼ü×ÖÊÇÎÞ·¨Ìæ´úsynchronized¹Ø¼ü×ֵģ¬ÒòΪvolatile¹Ø¼ü×ÖÎÞ·¨±£Ö¤²Ù×÷µÄÔ­×ÓÐÔ¡£Í¨³£À´Ëµ£¬Ê¹ÓÃvolatile±ØÐë¾ß±¸ÒÔÏÂ2¸öÌõ¼þ£º ¶Ô±äÁ¿µÄд²Ù×÷²»ÒÀÀµÓÚµ±Ç°Öµ(±ÈÈç++²Ù×÷£¬ÉÏÃæÓÐÀý×Ó) ¸Ã±äÁ¿Ã»Óаüº¬ÔÚ¾ßÓÐÆäËû±äÁ¿µÄ²»±äʽÖРʵ¼ÊÉÏ£¬ÕâЩÌõ¼þ±íÃ÷£¬¿ÉÒÔ±»Ð´Èë volatile ±äÁ¿µÄÕâЩÓÐЧֵ¶ÀÁ¢ÓÚÈκγÌÐòµÄ״̬£¬°üÀ¨±äÁ¿µÄµ±Ç°×´Ì¬¡£ ÊÂʵÉÏ£¬ÎÒµÄÀí½â¾ÍÊÇÉÏÃæµÄ2¸öÌõ¼þÐèÒª±£Ö¤²Ù×÷ÊÇÔ­×ÓÐÔ²Ù×÷£¬²ÅÄܱ£Ö¤Ê¹ÓÃvolatile¹Ø¼ü×ֵijÌÐòÔÚ²¢·¢Ê±Äܹ»ÕýÈ·Ö´ÐС£ ÏÂÃæÁоټ¸¸öJavaÖÐʹÓÃvolatileµÄ¼¸¸ö³¡¾°¡£ ״̬±ê¼ÇÁ¿ volatile boolean flag = false; while(!flag){ doSomething(); } public void setFlag() { flag = true; } volatile boolean inited = false; //Ïß³Ì1: context = loadContext(); inited = true; //Ïß³Ì2: while(!inited ){ sleep() } doSomethingwithconfig(context); double check 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; } }

ÕâÆªÎÄÕ¶ÔÄã¶àÓÐÓã¿

Ïà¹ØÎÄÕÂ

article How do I uninstall all Java on my Windows computer ?
How do I uninstall Java on my Windows computer...

(No rating)  4-26-2010    Views: 1931   
article 40¸ö´óÐÍÆóÒµJava¼¯ºÏÃæÊÔÎÊÌâºÍ´ð°¸
...

(No rating)  12-22-2016    Views: 651   
article Java 7й¦ÄܽéÉܼ°ÓëJava1.7ÐÔÄܲâÊԱȽÏ
Java 7й¦ÄܽéÉܼ°ÓëJava1.7ÐÔÄܲâÊԱȽÏÕâÀ

(No rating)  8-6-2011    Views: 1763   

Óû§ÆÀÓï

Ìí¼ÓÆÀÓï
µ±Ç°»¹Ã»ÓÐÆÀÓï.


.: .: .: .: .:
[ 怫 ]
±±¾©»¤º½¿Æ¼¼ÓÐÏÞ¹«Ë¾ 2006

Novots Technologies Limited