±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcnblogs,ÎÄÖÐÖ÷Òª´ÓһЩ»ù´¡¡¢ÖØÅÅÐò¡¢Ë³ÐòÒ»ÖÂÐÔ¡¢Volatile¡¢Ëø¡¢final¡¢×ܽáµÈ·½Ãæ½éÉܵ쬽éÉܱȽÏÏêϸÇë²ÎÔÄÏÂÎÄ |
|
»ù´¡
²¢·¢±à³ÌµÄÄ£ÐÍ·ÖÀà
ÔÚ²¢·¢±à³ÌÐèÒª´¦ÀíµÄÁ½¸ö¹Ø¼üÎÊÌâÊÇ£ºÏß³ÌÖ®¼äÈçºÎͨÐÅ ºÍ Ïß³ÌÖ®¼äÈçºÎͬ²½¡£
ͨÐÅ
ͨÐÅ ÊÇÖ¸Ïß³ÌÖ®¼äÒÔºÎÖÖ»úÖÆÀ´½»»»ÐÅÏ¢¡£ÔÚÃüÁîʽ±à³ÌÖУ¬Ïß³ÌÖ®¼äµÄͨÐÅ»úÖÆÓÐÁ½ÖÖ£º¹²ÏíÄÚ´æ ºÍ ÏûÏ¢´«µÝ¡£
ÔÚ¹²ÏíÄÚ´æµÄ²¢·¢Ä£ÐÍÀÏß³ÌÖ®¼ä¹²Ïí³ÌÐòµÄ¹«¹²×´Ì¬£¬Ïß³ÌÖ®¼äͨ¹ýд-¶ÁÄÚ´æÖеĹ«¹²×´Ì¬À´Òþʽ½øÐÐͨÐÅ¡£
ÔÚÏûÏ¢´«µÝµÄ²¢·¢Ä£ÐÍÀÏß³ÌÖ®¼äûÓй«¹²×´Ì¬£¬Ïß³ÌÖ®¼ä±ØÐëͨ¹ýÃ÷È·µÄ·¢ËÍÏûÏ¢À´ÏÔʽ½øÐÐͨÐÅ¡£
ͬ²½
ͬ²½ ÊÇÖ¸³ÌÐòÓÃÓÚ¿ØÖƲ»Í¬Ïß³ÌÖ®¼ä²Ù×÷·¢ÉúÏà¶Ô˳ÐòµÄ»úÖÆ¡£
ÔÚ¹²ÏíÄÚ´æµÄ²¢·¢Ä£ÐÍÀͬ²½ÊÇÏÔʽ½øÐеġ£³ÌÐòÔ±±ØÐëÏÔʽָ¶¨Ä³¸ö·½·¨»òij¶Î´úÂëÐèÒªÔÚÏß³ÌÖ®¼ä»¥³âÖ´ÐС£
ÔÚÏûÏ¢´«µÝµÄ²¢·¢Ä£ÐÍÀÓÉÓÚÏûÏ¢µÄ·¢ËͱØÐëÔÚÏûÏ¢µÄ½ÓÊÕ֮ǰ£¬Òò´Ëͬ²½ÊÇÒþʽ½øÐеġ£
Java µÄ²¢·¢²ÉÓõÄÊǹ²ÏíÄÚ´æÄ£ÐÍ£¬Java Ïß³ÌÖ®¼äµÄͨÐÅ×ÜÊÇÒþʽ½øÐУ¬Õû¸öͨÐŹý³Ì¶Ô³ÌÐòÔ±Íêȫ͸Ã÷¡£
JAVA ÄÚ´æÄ£Ð͵ijéÏó
ÔÚ Java ÖУ¬ËùÓÐʵÀýÓò¡¢¾²Ì¬Óò ºÍ Êý×éÔªËØ´æ´¢ÔÚ¶ÑÄÚ´æÖУ¬¶ÑÄÚ´æÔÚÏß³ÌÖ®¼ä¹²Ïí¡£¾Ö²¿±äÁ¿¡¢·½·¨¶¨Òå²ÎÊý
ºÍ Òì³£´¦ÀíÆ÷²ÎÊý ²»»áÔÚÏß³ÌÖ®¼ä¹²Ïí£¬ËüÃDz»»áÓÐÄÚ´æ¿É¼ûÐÔÎÊÌ⣬Ҳ²»ÊÜÄÚ´æÄ£Ð͵ÄÓ°Ïì¡£
Java Ïß³ÌÖ®¼äµÄͨÐÅÓÉ Java ÄÚ´æÄ£ÐÍ£¨JMM£©¿ØÖÆ¡£JMM ¾ö¶¨ÁËÒ»¸öÏ̶߳Թ²Ïí±äÁ¿µÄдÈëºÎʱ¶ÔÁíÒ»¸öÏ߳̿ɼû¡£´Ó³éÏóµÄ½Ç¶ÈÀ´¿´£¬JMM
¶¨ÒåÁËÏß³ÌÓëÖ÷ÄÚ´æÖ®¼äµÄ³éÏó¹ØÏµ£ºÏß³ÌÖ®¼äµÄ¹²Ïí±äÁ¿´æ´¢ÔÚÖ÷ÄÚ´æÖУ¬Ã¿Ò»¸öÏ̶߳¼ÓÐÒ»¸ö×Ô¼ºË½Óеı¾µØÄڴ棬±¾µØÄÚ´æÖд洢Á˸ñäÁ¿ÒÔ¶Á£¯Ð´¹²Ïí±äÁ¿µÄ¸±±¾¡£±¾µØÄÚ´æÊÇ
JMM µÄÒ»¸ö³éÏó¸ÅÄ²¢²»ÕæÊµ´æÔÚ¡£
JMM ³éÏóʾÒâͼ£º

´ÓÉÏͼÀ´¿´£¬Èç¹ûÏß³Ì A ºÍÏß³Ì B ҪͨÐŵϰ£¬ÒªÈçÏÂÁ½¸ö²½Ö裺
1¡¢Ïß³Ì A ÐèÒª½«±¾µØÄÚ´æ A ÖеĹ²Ïí±äÁ¿¸±±¾Ë¢Ðµ½Ö÷ÄÚ´æÈ¥
2¡¢Ïß³Ì B È¥Ö÷ÄÚ´æ¶ÁÈ¡Ïß³Ì A ֮ǰÒѸüйýµÄ¹²Ïí±äÁ¿
²½ÖèʾÒâͼ£º

¾Ù¸öÀý×Ó£º
±¾µØÄÚ´æ A ºÍ B ÓÐÖ÷ÄÚ´æ¹²Ïí±äÁ¿ X µÄ¸±±¾¡£¼ÙÉèÒ»¿ªÊ¼Ê±£¬ÕâÈý¸öÄÚ´æÖÐ X µÄÖµ¶¼ÊÇ 0¡£Ïß³Ì
A ÕýÖ´ÐÐʱ£¬°Ñ¸üкóµÄ X Öµ£¨¼ÙÉèΪ 1£©ÁÙʱ´æ·ÅÔÚ×Ô¼ºµÄ±¾µØÄÚ´æ A ÖС£µ±Ïß³Ì A ºÍ B
ÐèҪͨÐÅʱ£¬Ïß³Ì A Ê×ÏÈ»á°Ñ×Ô¼º±¾µØÄÚ´æ A ÖÐÐ޸ĺóµÄ X ֵˢе½Ö÷ÄÚ´æÈ¥£¬´ËʱÖ÷ÄÚ´æÖÐµÄ X
Öµ±äΪÁË 1¡£Ëæºó£¬Ïß³Ì B µ½Ö÷ÄÚ´æÖжÁÈ¡Ïß³Ì A ¸üкóµÄ¹²Ïí±äÁ¿ X µÄÖµ£¬´ËʱÏß³Ì B µÄ±¾µØÄÚ´æµÄ
X ÖµÒ²±ä³ÉÁË 1¡£
ÕûÌåÀ´¿´£¬ÕâÁ½¸ö²½ÖèʵÖÊÉÏÊÇÏß³Ì A ÔÙÏòÏß³Ì B ·¢ËÍÏûÏ¢£¬¶øÕâ¸öͨÐŹý³Ì±ØÐë¾¹ýÖ÷ÄÚ´æ¡£JMM
ͨ¹ý¿ØÖÆÖ÷ÄÚ´æÓëÿ¸öÏ̵߳ı¾µØÄÚ´æÖ®¼äµÄ½»»¥£¬À´Îª Java ³ÌÐòÔ±ÌṩÄÚ´æ¿É¼ûÐÔ±£Ö¤¡£
ÖØÅÅÐò
ÔÚÖ´ÐгÌÐòʱΪÁËÌá¸ßÐÔÄÜ£¬±àÒëÆ÷ºÍ´¦ÀíÆ÷³£³£»á¶ÔÖ¸Áî×öÖØÅÅÐò¡£ÖØÅÅÐò·ÖÈýÀࣺ
1¡¢±àÒëÆ÷ÓÅ»¯µÄÖØÅÅÐò¡£±àÒëÆ÷ÔÚ²»¸Ä±äµ¥Ï̳߳ÌÐòÓïÒåµÄǰÌáÏ£¬¿ÉÒÔÖØÐ°²ÅÅÓï¾äµÄÖ´ÐÐ˳Ðò¡£
2¡¢Ö¸Áî¼¶²¢ÐеÄÖØÅÅÐò¡£ÏÖ´ú´¦ÀíÆ÷²ÉÓÃÁËÖ¸Áî¼¶²¢Ðм¼ÊõÀ´½«¶àÌõÖ¸ÁîÖØµþÖ´ÐС£Èç¹û²»´æÔÚÊý¾ÝÒÀÀµÐÔ£¬´¦ÀíÆ÷¿ÉÒԸıäÓï¾ä¶ÔÓ¦»úÆ÷Ö¸ÁîµÄÖ´ÐÐ˳Ðò¡£
3¡¢ÄÚ´æÏµÍ³µÄÖØÅÅÐò¡£ÓÉÓÚ´¦ÀíÆ÷ʹÓûº´æºÍ¶Á£¯Ð´»º³åÇø£¬ÕâʹµÃ¼ÓÔØºÍ´æ´¢²Ù×÷¿´ÉÏÈ¥¿ÉÄÜÊÇÔÚÂÒÐòÖ´ÐС£
´Ó Java Ô´´úÂëµ½×îÖÕʵ¼ÊÖ´ÐеÄÖ¸ÁîÐòÁУ¬»á·Ö±ð¾ÀúÏÂÃæÈýÖÖÖØÅÅÐò£º

ÉÏÃæµÄÕâÐ©ÖØÅÅÐò¶¼¿ÉÄܵ¼Ö¶àÏ̳߳ÌÐò³öÏÖÄÚ´æ¿É¼ûÐÔÎÊÌâ¡£¶ÔÓÚ±àÒëÆ÷£¬JMM µÄ±àÒëÆ÷ÖØÅÅÐò¹æÔò»á½ûÖ¹ÌØ¶¨ÀàÐ͵ıàÒëÆ÷ÖØÅÅÐò£¨²»ÊÇËùÓеıàÒëÆ÷ÖØÅÅÐò¶¼Òª½ûÖ¹£©¡£¶ÔÓÚ´¦ÀíÆ÷ÖØÅÅÐò£¬JMM
µÄ´¦ÀíÆ÷ÖØÅÅÐò¹æÔò»áÒªÇó Java ±àÒëÆ÷ÔÚÉú³ÉÖ¸ÁîÐòÁÐʱ£¬²åÈëÌØ¶¨ÀàÐ͵ÄÄÚ´æÆÁÕÏÖ¸Áͨ¹ýÄÚ´æÆÁÕÏÖ¸ÁîÀ´½ûÖ¹ÌØ¶¨ÀàÐ͵Ĵ¦ÀíÆ÷ÖØÅÅÐò£¨²»ÊÇËùÓеĴ¦ÀíÆ÷ÖØÅÅÐò¶¼Òª½ûÖ¹£©¡£
JMM ÊôÓÚÓïÑÔ¼¶µÄÄÚ´æÄ£ÐÍ£¬ËüÈ·±£ÔÚ²»Í¬µÄ±àÒëÆ÷ºÍ²»Í¬µÄ´¦ÀíÆ÷ƽ̨֮ÉÏ£¬Í¨¹ý½ûÖ¹ÌØ¶¨ÀàÐ͵ıàÒëÆ÷ÖØÅÅÐòºÍ´¦ÀíÆ÷ÖØÅÅÐò£¬Îª³ÌÐòÔ±ÌṩһÖµÄÄÚ´æ¿É¼ûÐÔ±£Ö¤¡£
´¦ÀíÆ÷ÖØÅÅÐò
ÏÖ´úµÄ´¦ÀíÆ÷ʹÓÃд»º³åÇøÀ´ÁÙʱ±£´æÏòÄÚ´æÐ´ÈëµÄÊý¾Ý¡£Ð´»º³åÇø¿ÉÒÔ±£Ö¤Ö¸ÁîÁ÷Ë®Ïß³ÖÐøÔËÐУ¬Ëü¿ÉÒÔ±ÜÃâÓÉÓÚ´¦ÀíÆ÷Í£¶ÙÏÂÀ´µÈ´ýÏòÄÚ´æÐ´ÈëÊý¾Ý¶ø²úÉúµÄÑÓ³Ù¡£Í¬Ê±£¬Í¨¹ýÒÔÅú´¦ÀíµÄ·½Ê½Ë¢ÐÂд»º³åÇø£¬ÒÔ¼°ºÏ²¢Ð´»º³åÇøÖжÔͬһÄÚ´æµØÖ·µÄ¶à´Îд£¬¿ÉÒÔ¼õÉÙ¶ÔÄÚ´æ×ÜÏßµÄÕ¼Óá£ËäȻд»º³åÇøÓÐÕâô¶àºÃ´¦£¬µ«Ã¿¸ö´¦ÀíÆ÷ÉϵÄд»º³åÇø£¬½ö½ö¶ÔËüËùÔڵĴ¦ÀíÆ÷¿É¼û¡£Õâ¸öÌØÐÔ»á¶ÔÄÚ´æ²Ù×÷µÄÖ´ÐÐ˳Ðò²úÉúÖØÒªµÄÓ°Ï죺´¦ÀíÆ÷¶ÔÄÚ´æµÄ¶Á/д²Ù×÷µÄÖ´ÐÐ˳Ðò£¬²»Ò»¶¨ÓëÄÚ´æÊµ¼Ê·¢ÉúµÄ¶Á/д²Ù×÷˳ÐòÒ»Ö£¡
¾Ù¸öÀý×Ó£º

¼ÙÉè´¦ÀíÆ÷AºÍ´¦ÀíÆ÷B°´³ÌÐòµÄ˳Ðò²¢ÐÐÖ´ÐÐÄÚ´æ·ÃÎÊ£¬×îÖÕÈ´¿ÉÄܵõ½ x = y = 0¡£¾ßÌåµÄÔÒòÈçÏÂͼËùʾ£º

´¦ÀíÆ÷ A ºÍ B ͬʱ°Ñ¹²Ïí±äÁ¿Ð´ÈëÔÚд»º³åÇøÖУ¨A1¡¢B1£©£¬È»ºóÔÙ´ÓÄÚ´æÖжÁÈ¡ÁíÒ»¸ö¹²Ïí±äÁ¿£¨A2¡¢B2£©£¬×îºó²Å°Ñ×Ô¼ºÐ´»º³åÇøÖб£´æµÄÔàÊý¾Ýˢе½ÄÚ´æÖУ¨A3¡¢B3£©¡£µ±ÒÔÕâÖÖʱÐòÖ´ÐÐʱ£¬³ÌÐò¾Í¿ÉÒԵõ½
x = y = 0 µÄ½á¹û¡£
´ÓÄÚ´æ²Ù×÷ʵ¼Ê·¢ÉúµÄ˳ÐòÀ´¿´£¬Ö±µ½´¦ÀíÆ÷ A Ö´ÐÐ A3 À´Ë¢ÐÂ×Ô¼ºµÄд»º´æÇø£¬Ð´²Ù×÷ A1 ²ÅËãÕæÕýÖ´ÐÐÁË¡£ËäÈ»´¦ÀíÆ÷
A Ö´ÐÐÄÚ´æ²Ù×÷µÄ˳ÐòΪ£ºA1 -> A2£¬µ«ÄÚ´æ²Ù×÷ʵ¼Ê·¢ÉúµÄ˳ÐòÈ´ÊÇ£ºA2 -> A1¡£´Ëʱ£¬´¦ÀíÆ÷
A µÄÄÚ´æ²Ù×÷˳Ðò±»ÖØÅÅÐòÁË¡£
ÕâÀïµÄ¹Ø¼üÊÇ£¬ÓÉÓÚд»º³åÇø½ö¶Ô×Ô¼ºµÄ´¦ÀíÆ÷¿É¼û£¬Ëü»áµ¼Ö´¦ÀíÆ÷Ö´ÐÐÄÚ´æ²Ù×÷µÄ˳Ðò¿ÉÄÜ»áÓëÄÚ´æÊµ¼ÊµÄ²Ù×÷Ö´ÐÐ˳Ðò²»Ò»Ö¡£ÓÉÓÚÏÖ´úµÄ´¦ÀíÆ÷¶¼»áʹÓÃд»º³åÇø£¬Òò´ËÏÖ´úµÄ´¦ÀíÆ÷¶¼»áÔÊÐí¶Ôд-¶Á²Ù×÷ÖØÅÅÐò¡£
ÄÚ´æÆÁÕÏÖ¸Áî
ΪÁ˱£Ö¤ÄÚ´æ¿É¼ûÐÔ£¬Java ±àÒëÆ÷ÔÚÉú³ÉÖ¸ÁîÐòÁеÄÊʵ±Î»Öûá²åÈëÄÚ´æÆÁÕÏÖ¸ÁîÀ´½ûÖ¹ÌØ¶¨ÀàÐ͵Ĵ¦ÀíÆ÷ÖØÅÅÐò¡£JMM
°ÑÄÚ´æÆÁÕÏÖ¸Áî·ÖΪÏÂÁÐËÄÀࣺ
ÆÁÕÏÀàÐÍ |
Ö¸ÁîʾÀý |
˵Ã÷ |
LoadLoad Barriers |
Load1; LoadLoad; Load2 |
È·±£ Load1 Êý¾ÝµÄ×°ÔØ£¬Ö®Ç°ÓÚ Load2 ¼°ËùÓкóÐø×°ÔØÖ¸ÁîµÄ×°ÔØ¡£ |
StoreStore Barriers |
Store1; StoreStore; Store2 |
È·±£ Store1 Êý¾Ý¶ÔÆäËû´¦ÀíÆ÷¿É¼û£¨Ë¢Ðµ½Äڴ棩£¬Ö®Ç°ÓÚ Store2 ¼°ËùÓкóÐø´æ´¢Ö¸ÁîµÄ´æ´¢¡£ |
LoadStore Barriers |
Load1; LoadStore; Store2 |
È·±£ Load1 Êý¾Ý×°ÔØ£¬Ö®Ç°ÓÚ Store2 ¼°ËùÓкóÐøµÄ´æ´¢Ö¸Áîˢе½ÄÚ´æ¡£ |
StoreLoad Barriers |
Store1; StoreLoad; Load2 |
È·±£ Store1 Êý¾Ý¶ÔÆäËû´¦ÀíÆ÷±äµÃ¿É¼û£¨Ö¸Ë¢Ðµ½Äڴ棩£¬Ö®Ç°ÓÚ Load2 ¼°ËùÓкóÐø×°ÔØÖ¸ÁîµÄ×°ÔØ¡£StoreLoadBarriers
»áʹ¸ÃÆÁÕÏ֮ǰµÄËùÓÐÄÚ´æ·ÃÎÊÖ¸Á´æ´¢ºÍ×°ÔØÖ¸ÁÍê³ÉÖ®ºó£¬²ÅÖ´ÐÐ¸ÃÆÁÕÏÖ®ºóµÄÄÚ´æ·ÃÎÊÖ¸Áî¡£ |
HAPPENS-BEFORE
JSR-133 ÄÚ´æÄ£ÐÍʹÓà happens-before µÄ¸ÅÄîÀ´²ûÊö²Ù×÷Ö®¼äµÄÄÚ´æ¿É¼ûÐÔ¡£ÔÚ JMM
ÖУ¬Èç¹ûÒ»¸ö²Ù×÷Ö´ÐеĽá¹ûÐèÒª¶ÔÁíÒ»¸ö²Ù×÷¿É¼û£¬ÄÇôÕâÁ½¸ö²Ù×÷Ö®¼ä±ØÐëÒª´æÔÚ happens-before
¹ØÏµ¡£ÕâÀïÌáµ½µÄÁ½¸ö²Ù×÷¼È¿ÉÒÔÊÇÔÚÒ»¸öÏß³ÌÖ®ÄÚ£¬Ò²¿ÉÒÔÊÇÔÚ²»Í¬Ïß³ÌÖ®¼ä¡£
Óë³ÌÐòÔ±ÃÜÇÐÏà¹ØµÄ happens-before ¹æÔòÈçÏ£º
³ÌÐò˳Ðò¹æÔò£ºÒ»¸öÏß³ÌÖеÄÿ¸ö²Ù×÷£¬happens-before ÓÚ¸ÃÏß³ÌÖеÄÈÎÒâºóÐø²Ù×÷¡£
¼àÊÓÆ÷Ëø¹æÔò£º¶ÔÒ»¸ö¼àÊÓÆ÷µÄ½âËø£¬happens-before ÓÚËæºó¶ÔÕâ¸ö¼àÊÓÆ÷µÄ¼ÓËø¡£
volatile ±äÁ¿¹æÔò£º¶ÔÒ»¸ö volatile ÓòµÄд£¬happens-before ÓÚÈÎÒâºóÐø¶ÔÕâ¸ö
volatile ÓòµÄ¶Á¡£
´«µÝÐÔ£ºÈç¹û A happens-before B£¬ÇÒ B happens-before C£¬ÄÇô
A happens-before C¡£
×¢Ò⣬Á½¸ö²Ù×÷Ö®¼ä¾ßÓÐ happens-before ¹ØÏµ£¬²¢²»Òâζ×Åǰһ¸ö²Ù×÷±ØÐëÒªÔÚºóÒ»¸ö²Ù×÷֮ǰִÐУ¡happens-before
½ö½öÒªÇóǰһ¸ö²Ù×÷£¨Ö´ÐеĽá¹û£©¶ÔºóÒ»¸ö²Ù×÷¿É¼û£¬ÇÒǰһ¸ö²Ù×÷°´Ë³ÐòÅÅÔÚµÚ¶þ¸ö²Ù×÷֮ǰ£¨the first
is visible to and ordered before the second£©¡£
happens-before Óë JMM µÄ¹ØÏµÈçÏÂͼËùʾ£º

ÈçÉÏͼËùʾ£¬Ò»¸ö happens-before ¹æÔò¶ÔÓ¦ÓÚÒ»¸ö»ò¶à¸ö±àÒëÆ÷ºÍ´¦ÀíÆ÷ÖØÅÅÐò¹æÔò¡£
Êý¾ÝÒÀÀµÐÔ
Èç¹ûÁ½¸ö²Ù×÷·ÃÎÊͬһ¸ö±äÁ¿£¬ÇÒÕâÁ½¸ö²Ù×÷ÖÐÓÐÒ»¸öΪд²Ù×÷£¬´ËʱÕâÁ½¸ö²Ù×÷Ö®¼ä¾Í´æÔÚÊý¾ÝÒÀÀµÐÔ¡£Êý¾ÝÒÀÀµ·ÖÏÂÁÐÈýÖÖÀàÐÍ£º
Ãû³Æ |
´úÂëʾÀý |
˵Ã÷ |
дºó¶Á |
a = 1; b = a; |
дһ¸ö±äÁ¿Ö®ºó£¬ÔÙ¶ÁÕâ¸öλÖᣠ|
дºóд |
a = 1; a = 2; |
дһ¸ö±äÁ¿Ö®ºó£¬ÔÙдÕâ¸ö±äÁ¿¡£ |
¶Áºóд |
a = b; b = 1; |
¶ÁÒ»¸ö±äÁ¿Ö®ºó£¬ÔÙдÕâ¸ö±äÁ¿¡£ |
ÉÏÃæÈýÖÖÇé¿ö£¬Ö»ÒªÖØÅÅÐòÁ½¸ö²Ù×÷µÄÖ´ÐÐ˳Ðò£¬³ÌÐòµÄÖ´Ðнá¹û½«»á±»¸Ä±ä¡£
Ç°ÃæÌáµ½¹ý£¬±àÒëÆ÷ºÍ´¦ÀíÆ÷¿ÉÄÜ»á¶Ô²Ù×÷×öÖØÅÅÐò¡£±àÒëÆ÷ºÍ´¦ÀíÆ÷ÔÚÖØÅÅÐòʱ£¬»á×ñÊØÊý¾ÝÒÀÀµÐÔ£¬±àÒëÆ÷ºÍ´¦ÀíÆ÷²»»á¸Ä±ä´æÔÚÊý¾ÝÒÀÀµ¹ØÏµµÄÁ½¸ö²Ù×÷µÄÖ´ÐÐ˳Ðò¡£
×¢Ò⣬ÕâÀïËù˵µÄÊý¾ÝÒÀÀµÐÔ½öÕë¶Ôµ¥¸ö´¦ÀíÆ÷ÖÐÖ´ÐеÄÖ¸ÁîÐòÁк͵¥¸öÏß³ÌÖÐÖ´ÐеIJÙ×÷£¬²»Í¬´¦ÀíÆ÷Ö®¼äºÍ²»Í¬Ïß³ÌÖ®¼äµÄÊý¾ÝÒÀÀµÐÔ²»±»±àÒëÆ÷ºÍ´¦ÀíÆ÷¿¼ÂÇ¡£
AS-IF-SERIAL ÓïÒå
as-if-serial ÓïÒåµÄÒâ˼ָ£º²»¹ÜÔõÃ´ÖØÅÅÐò£¨±àÒëÆ÷ºÍ´¦ÀíÆ÷ΪÁËÌá¸ß²¢Ðжȣ©£¬£¨µ¥Ị̈߳©³ÌÐòµÄÖ´Ðнá¹û²»Äܱ»¸Ä±ä¡£±àÒëÆ÷£¬runtime
ºÍ´¦ÀíÆ÷¶¼±ØÐë×ñÊØ as-if-serial ÓïÒå¡£
ΪÁË×ñÊØ as-if-serial ±àÒëÆ÷ºÍ´¦ÀíÆ÷²»»á¶Ô´æÔÚÊý¾ÝÒÀÀµ¹ØÏµµÄ²Ù×÷×öÖØÅÅÐò£¬ÒòΪÕâÖÖÖØÅÅÐò»á¸Ä±äÖ´Ðнá¹û¡£µ«ÊÇÈç¹û²Ù×÷Ö®¼äûÓÐÊý¾ÝÒÀÀµ¹ØÏµ£¬ÕâЩ²Ù×÷¾Í¿ÉÄܱ»±àÒëÆ÷ºÍ´¦ÀíÆ÷ÖØÅÅÐò¡£
¾Ù¸öÀý×Ó£º
double pi = 3.14;
//A
double r = 1.0; //B
double area = pi * r * r; //C |
ÉÏÃæÈý¸ö²Ù×÷µÄÊý¾ÝÒÀÀµ¹ØÏµÈçÏÂͼËùʾ£º

ÈçÉÏͼËùʾ£¬A ºÍ C Ö®¼ä´æÔÚÊý¾ÝÒÀÀµ¹ØÏµ£¬Í¬Ê± B ºÍ C Ö®¼äÒ²´æÔÚÊý¾ÝÒÀÀµ¹ØÏµ¡£Òò´ËÔÚ×îÖÕÖ´ÐеÄÖ¸ÁîÐòÁÐÖУ¬C
²»Äܱ»ÖØÅÅÐòµ½ A ºÍ B µÄÇ°Ãæ£¨C Åŵ½ A ºÍ B µÄÇ°Ãæ£¬³ÌÐòµÄ½á¹û½«»á±»¸Ä±ä£©¡£µ« A ºÍ
B Ö®¼äûÓÐÊý¾ÝÒÀÀµ¹ØÏµ£¬±àÒëÆ÷ºÍ´¦ÀíÆ÷¿ÉÒÔÖØÅÅÐò A ºÍ B Ö®¼äµÄÖ´ÐÐ˳Ðò¡£ÏÂͼÊǸóÌÐòµÄÁ½ÖÖÖ´ÐÐ˳Ðò£º

ÔÚ¼ÆËã»úÖУ¬Èí¼þ¼¼ÊõºÍÓ²¼þ¼¼ÊõÓÐÒ»¸ö¹²Í¬µÄÄ¿±ê£ºÔÚ²»¸Ä±ä³ÌÐòÖ´Ðнá¹ûµÄǰÌáÏ£¬¾¡¿ÉÄܵĿª·¢²¢Ðжȡ£±àÒëÆ÷ºÍ´¦ÀíÆ÷×ñ´ÓÕâһĿ±ê£¬´Ó
happens-before µÄ¶¨ÒåÎÒÃÇ¿ÉÒÔ¿´³ö£¬JMM ͬÑù×ñ´ÓÕâһĿ±ê¡£
ÖØÅÅÐò¶Ô¶àÏ̵߳ÄÓ°Ïì
¾ÙÀý£º
class Demo {
int a = 0;
boolean flag = false;
public void write() {
a = 1; //1
flag = true; //2
}
public void read() {
if(flag) { //3
int i = a * a; //4
}
}
} |
ÓÉÓÚ²Ù×÷ 1 ºÍ 2 ûÓÐÊý¾ÝÒÀÀµ¹ØÏµ£¬±àÒëÆ÷ºÍ´¦ÀíÆ÷¿ÉÒÔ¶ÔÕâÁ½¸ö²Ù×÷ÖØÅÅÐò£»²Ù×÷ 3 ºÍ²Ù×÷ 4
ûÓÐÊý¾ÝÒÀÀµ¹ØÏµ£¬±àÒëÆ÷ºÍ´¦ÀíÆ÷Ò²¿ÉÒÔ¶ÔÕâÁ½¸ö²Ù×÷ÖØÅÅÐò¡£
1¡¢µ±²Ù×÷ 1 ºÍ²Ù×÷ 2 ÖØÅÅÐòʱ£¬¿ÉÄÜ»á²úÉúʲôЧ¹û£¿

ÈçÉÏͼËùʾ£¬²Ù×÷ 1 ºÍ²Ù×÷ 2 ×öÁËÖØÅÅÐò¡£³ÌÐòÖ´ÐÐʱ£¬Ïß³Ì A Ê×ÏÈд±ê¼Ç±äÁ¿ flag£¬ËæºóÏß³Ì
B ¶ÁÕâ¸ö±äÁ¿¡£ÓÉÓÚÌõ¼þÅжÏÎªÕæ£¬Ïß³Ì B ½«¶ÁÈ¡±äÁ¿ a¡£´Ëʱ£¬±äÁ¿ a »¹¸ù±¾Ã»Óб»Ïß³Ì A дÈ룬ÔÚÕâÀï¶àÏ̳߳ÌÐòµÄÓïÒå±»ÖØÅÅÐòÆÆ»µÁË£¡
2¡¢µ±²Ù×÷ 3 ºÍ²Ù×÷ 4 ÖØÅÅÐòʱ»á²úÉúʲôЧ¹û£¨½èÖúÕâ¸öÖØÅÅÐò£¬¿ÉÒÔ˳±ã˵Ã÷¿ØÖÆÒÀÀµÐÔ£©¡£

ÔÚ³ÌÐòÖУ¬²Ù×÷ 3 ºÍ²Ù×÷ 4 ´æÔÚ¿ØÖÆÒÀÀµ¹ØÏµ¡£µ±´úÂëÖдæÔÚ¿ØÖÆÒÀÀµÐÔʱ£¬»áÓ°ÏìÖ¸ÁîÐòÁÐÖ´ÐеIJ¢Ðжȡ£Îª´Ë£¬±àÒëÆ÷ºÍ´¦ÀíÆ÷»á²ÉÓò²⣨Speculation£©Ö´ÐÐÀ´¿Ë·þ¿ØÖÆÏà¹ØÐÔ¶Ô²¢ÐжȵÄÓ°Ïì¡£ÒÔ´¦ÀíÆ÷µÄ²Â²âÖ´ÐÐΪÀý£¬Ö´ÐÐÏß³Ì
B µÄ´¦ÀíÆ÷¿ÉÒÔÌáǰ¶ÁÈ¡²¢¼ÆËã a * a£¬È»ºó°Ñ¼ÆËã½á¹ûÁÙʱ±£´æµ½Ò»¸öÃûÎªÖØÅÅÐò»º³å£¨reorder
buffer ROB£©µÄÓ²¼þ»º´æÖС£µ±½ÓÏÂÀ´²Ù×÷ 3 µÄÌõ¼þÅжÏÎªÕæÊ±£¬¾Í°Ñ¸Ã¼ÆËã½á¹ûдÈë±äÁ¿ i
ÖС£
´ÓͼÖÐÎÒÃÇ¿ÉÒÔ¿´³ö£¬²Â²âÖ´ÐÐʵÖÊÉ϶ԲÙ×÷3ºÍ4×öÁËÖØÅÅÐò¡£ÖØÅÅÐòÔÚÕâÀïÆÆ»µÁ˶àÏ̳߳ÌÐòµÄÓïÒ壡
ÔÚµ¥Ï̳߳ÌÐòÖУ¬¶Ô´æÔÚ¿ØÖÆÒÀÀµµÄ²Ù×÷ÖØÅÅÐò£¬²»»á¸Ä±äÖ´Ðнá¹û£¨ÕâÒ²ÊÇ as-if-serial ÓïÒåÔÊÐí¶Ô´æÔÚ¿ØÖÆÒÀÀµµÄ²Ù×÷×öÖØÅÅÐòµÄÔÒò£©£»µ«ÔÚ¶àÏ̳߳ÌÐòÖУ¬¶Ô´æÔÚ¿ØÖÆÒÀÀµµÄ²Ù×÷ÖØÅÅÐò£¬¿ÉÄÜ»á¸Ä±ä³ÌÐòµÄÖ´Ðнá¹û¡£
˳ÐòÒ»ÖÂÐÔ
˳ÐòÒ»ÖÂÐÔÄÚ´æÄ£ÐÍ
˳ÐòÒ»ÖÂÐÔÄÚ´æÄ£ÐÍÓÐÁ½´óÌØÐÔ£º
Ò»¸öÏß³ÌÖеÄËùÓвÙ×÷±ØÐë°´ÕÕ³ÌÐòµÄ˳ÐòÀ´Ö´ÐС£
£¨²»¹Ü³ÌÐòÊÇ·ñͬ²½£©ËùÓÐÏ̶߳¼Ö»ÄÜ¿´µ½Ò»¸öµ¥Ò»µÄ²Ù×÷Ö´ÐÐ˳Ðò¡£ÔÚ˳ÐòÒ»ÖÂÐÔÄÚ´æÄ£ÐÍÖУ¬Ã¿¸ö²Ù×÷¶¼±ØÐëÔ×ÓÖ´ÐÐÇÒÁ¢¿Ì¶ÔËùÓÐÏ߳̿ɼû¡£
˳ÐòÒ»ÖÂÐÔÄÚ´æÄ£ÐÍΪ³ÌÐòÔ±ÌṩµÄÊÓͼÈçÏ£º

ÔÚ¸ÅÄîÉÏ£¬Ë³ÐòÒ»ÖÂÐÔÄ£ÐÍÓÐÒ»¸öµ¥Ò»µÄÈ«¾ÖÄڴ棬Õâ¸öÄÚ´æÍ¨¹ýÒ»¸ö×óÓÒ°Ú¶¯µÄ¿ª¹Ø¿ÉÒÔÁ¬½Óµ½ÈÎÒâÒ»¸öỊ̈߳¬Í¬Ê±Ã¿Ò»¸öÏ̱߳ØÐë°´ÕÕ³ÌÐòµÄ˳ÐòÀ´Ö´ÐÐÄÚ´æ¶Á/д²Ù×÷¡£´ÓÉÏÃæµÄʾÒâͼÎÒÃÇ¿ÉÒÔ¿´³ö£¬ÔÚÈÎÒâʱ¼äµã×î¶àÖ»ÄÜÓÐÒ»¸öÏ߳̿ÉÒÔÁ¬½Óµ½ÄÚ´æ¡£µ±¶à¸öÏ̲߳¢·¢Ö´ÐÐʱ£¬Í¼ÖеĿª¹Ø×°ÖÃÄܰÑËùÓÐÏ̵߳ÄËùÓÐÄÚ´æ¶Á/д²Ù×÷´®Ðл¯¡£
¾Ù¸öÀý×Ó£º
¼ÙÉèÓÐÁ½¸öÏß³Ì A ºÍ B ²¢·¢Ö´ÐС£ÆäÖÐ A Ïß³ÌÓÐÈý¸ö²Ù×÷£¬ËüÃÇÔÚ³ÌÐòÖеÄ˳ÐòÊÇ£ºA1 ->
A2 -> A3¡£B Ïß³ÌÒ²ÓÐÈý¸ö²Ù×÷£¬ËüÃÇÔÚ³ÌÐòÖеÄ˳ÐòÊÇ£ºB1 -> B2 ->
B3¡£
¼ÙÉèÕâÁ½¸öÏß³ÌʹÓüàÊÓÆ÷ËøÀ´Õýȷͬ²½£ºA Ï̵߳ÄÈý¸ö²Ù×÷Ö´ÐкóÊͷżàÊÓÆ÷Ëø£¬Ëæºó B Ï̻߳ñȡͬһ¸ö¼àÊÓÆ÷Ëø¡£ÄÇô³ÌÐòÔÚ˳ÐòÒ»ÖÂÐÔÄ£ÐÍÖеÄÖ´ÐÐЧ¹û½«ÈçÏÂͼËùʾ£º

ÏÖÔÚÎÒÃÇÔÙ¼ÙÉèÕâÁ½¸öÏß³ÌûÓÐ×öͬ²½£¬ÏÂÃæÊÇÕâ¸öδͬ²½³ÌÐòÔÚ˳ÐòÒ»ÖÂÐÔÄ£ÐÍÖеÄÖ´ÐÐʾÒâͼ£º

δͬ²½³ÌÐòÔÚ˳ÐòÒ»ÖÂÐÔÄ£ÐÍÖÐËäÈ»ÕûÌåÖ´ÐÐ˳ÐòÊÇÎÞÐòµÄ£¬µ«ËùÓÐÏ̶߳¼Ö»ÄÜ¿´µ½Ò»¸öÒ»ÖµÄÕûÌåÖ´ÐÐ˳Ðò¡£ÒÔÉÏͼΪÀý£¬Ïß³Ì
A ºÍ B ¿´µ½µÄÖ´ÐÐ˳Ðò¶¼ÊÇ£ºB1 -> A1 -> A2 -> B2 ->
A3 -> B3¡£Ö®ËùÒÔÄܵõ½Õâ¸ö±£Ö¤ÊÇÒòΪ˳ÐòÒ»ÖÂÐÔÄÚ´æÄ£ÐÍÖеÄÿ¸ö²Ù×÷±ØÐëÁ¢¼´¶ÔÈÎÒâÏ߳̿ɼû¡£
µ«ÊÇ£¬ÔÚ JMM ÖоÍûÓÐÕâ¸ö±£Ö¤¡£Î´Í¬²½³ÌÐòÔÚ JMM Öв»µ«ÕûÌåµÄÖ´ÐÐ˳ÐòÊÇÎÞÐòµÄ£¬¶øÇÒËùÓÐÏ߳̿´µ½µÄ²Ù×÷Ö´ÐÐ˳ÐòÒ²¿ÉÄܲ»Ò»Ö¡£±ÈÈ磬ÔÚµ±Ç°Ḭ̈߳Ñд¹ýµÄÊý¾Ý»º´æÔÚ±¾µØÄÚ´æÖУ¬ÔÚ»¹Ã»ÓÐˢе½Ö÷ÄÚ´æÖ®Ç°£¬Õâ¸öд²Ù×÷½ö¶Ôµ±Ç°Ï߳̿ɼû£»´ÓÆäËûÏ̵߳ĽǶÈÀ´¹Û²ì£¬»áÈÏΪÕâ¸öд²Ù×÷¸ù±¾»¹Ã»Óб»µ±Ç°Ïß³ÌÖ´ÐС£Ö»Óе±Ç°Ḭ̈߳ѱ¾µØÄÚ´æÖÐд¹ýµÄÊý¾Ýˢе½Ö÷ÄÚ´æÖ®ºó£¬Õâ¸öд²Ù×÷²ÅÄÜ¶ÔÆäËûÏ߳̿ɼû¡£ÔÚÕâÖÖÇé¿öÏ£¬µ±Ç°Ïß³ÌºÍÆäËüÏ߳̿´µ½µÄ²Ù×÷Ö´ÐÐ˳Ðò½«²»Ò»Ö¡£
ͬ²½³ÌÐòµÄ˳ÐòÒ»ÖÂÐÔЧ¹û
ÏÂÃæÎÒÃǶÔÇ°ÃæµÄʾÀý³ÌÐòÓÃËøÀ´Í¬²½£¬¿´¿´Õýȷͬ²½µÄ³ÌÐòÈçºÎ¾ßÓÐ˳ÐòÒ»ÖÂÐÔ¡£
Çë¿´ÏÂÃæµÄʾÀý´úÂ룺
class demo {
int a = 0;
boolean flag = false;
public synchronized void write() { //»ñÈ¡Ëø
a = 1;
flag = true;
} //ÊÍ·ÅËø
public synchronized void read() { //»ñÈ¡Ëø
if(flag) {
int i = a;
}
} //ÊÍ·ÅËø
} |
ÉÏÃæÊ¾Àý´úÂëÖУ¬¼ÙÉè A Ïß³ÌÖ´ÐÐ write() ·½·¨ºó£¬B Ïß³ÌÖ´ÐÐ reade() ·½·¨¡£ÕâÊÇÒ»¸öÕýȷͬ²½µÄ¶àÏ̳߳ÌÐò¡£¸ù¾ÝJMM¹æ·¶£¬¸Ã³ÌÐòµÄÖ´Ðнá¹û½«Óë¸Ã³ÌÐòÔÚ˳ÐòÒ»ÖÂÐÔÄ£ÐÍÖеÄÖ´Ðнá¹ûÏàͬ¡£ÏÂÃæÊǸóÌÐòÔÚÁ½¸öÄÚ´æÄ£ÐÍÖеÄÖ´ÐÐʱÐò¶Ô±Èͼ£º

ÔÚ˳ÐòÒ»ÖÂÐÔÄ£ÐÍÖУ¬ËùÓвÙ×÷ÍêÈ«°´³ÌÐòµÄ˳ÐòÖ´ÐС£¶øÔÚ JMM ÖУ¬ÁÙ½çÇøÄڵĴúÂë¿ÉÒÔÖØÅÅÐò£¨µ«
JMM ²»ÔÊÐíÁÙ½çÇøÄڵĴúÂë¡°Òݳö¡±µ½ÁÙ½çÇøÖ®Í⣬ÄÇÑù»áÆÆ»µ¼àÊÓÆ÷µÄÓïÒ壩¡£JMM »áÔÚÍ˳öÁÙ½çÇøºÍ½øÈëÁÙ½çÇøÕâÁ½¸ö¹Ø¼üʱ¼äµã×öÒ»Ð©ÌØ±ð´¦Àí£¬Ê¹µÃÏß³ÌÔÚÕâÁ½¸öʱ¼äµã¾ßÓÐÓë˳ÐòÒ»ÖÂÐÔÄ£ÐÍÏàͬµÄÄÚ´æÊÓͼ¡£ËäÈ»Ïß³Ì
A ÔÚÁÙ½çÇøÄÚ×öÁËÖØÅÅÐò£¬µ«ÓÉÓÚ¼àÊÓÆ÷µÄ»¥³âÖ´ÐеÄÌØÐÔ£¬ÕâÀïµÄÏß³Ì B ¸ù±¾ÎÞ·¨¡°¹Û²ì¡±µ½Ïß³Ì A
ÔÚÁÙ½çÇøÄÚµÄÖØÅÅÐò¡£ÕâÖÖÖØÅÅÐò¼ÈÌá¸ßÁËÖ´ÐÐЧÂÊ£¬ÓÖûÓиıä³ÌÐòµÄÖ´Ðнá¹û¡£
´ÓÕâÀïÎÒÃÇ¿ÉÒÔ¿´µ½ JMM ÔÚ¾ßÌåʵÏÖÉϵĻù±¾·½Õ룺ÔÚ²»¸Ä±ä£¨Õýȷͬ²½µÄ£©³ÌÐòÖ´Ðнá¹ûµÄǰÌáÏ£¬¾¡¿ÉÄܵÄΪ±àÒëÆ÷ºÍ´¦ÀíÆ÷µÄÓÅ»¯´ò¿ª·½±ãÖ®ÃÅ¡£
δͬ²½³ÌÐòµÄÖ´ÐÐÌØÐÔ
δͬ²½³ÌÐòÔÚ JMM ÖеÄÖ´ÐÐʱ£¬ÕûÌåÉÏÊÇÎÞÐòµÄ£¬ÆäÖ´Ðнá¹ûÎÞ·¨Ô¤Öª¡£Î´Í¬²½³ÌÐòÔÚÁ½¸öÄ£ÐÍÖеÄÖ´ÐÐÌØÐÔÓÐÏÂÃæ¼¸¸ö²îÒ죺
˳ÐòÒ»ÖÂÐÔÄ£Ðͱ£Ö¤µ¥Ïß³ÌÄڵIJÙ×÷»á°´³ÌÐòµÄ˳ÐòÖ´ÐУ¬¶ø JMM ²»±£Ö¤µ¥Ïß³ÌÄڵIJÙ×÷»á°´³ÌÐòµÄ˳ÐòÖ´ÐУ¨±ÈÈçÉÏÃæÕýȷͬ²½µÄ¶àÏ̳߳ÌÐòÔÚÁÙ½çÇøÄÚµÄÖØÅÅÐò£©¡£
˳ÐòÒ»ÖÂÐÔÄ£Ðͱ£Ö¤ËùÓÐÏß³ÌÖ»ÄÜ¿´µ½Ò»ÖµIJÙ×÷Ö´ÐÐ˳Ðò£¬¶ø JMM ²»±£Ö¤ËùÓÐÏß³ÌÄÜ¿´µ½Ò»ÖµIJÙ×÷Ö´ÐÐ˳Ðò¡£
JMM ²»±£Ö¤¶Ô 64 λµÄ long ÐÍºÍ double ÐͱäÁ¿µÄ¶Á/д²Ù×÷¾ßÓÐÔ×ÓÐÔ£¬¶øË³ÐòÒ»ÖÂÐÔÄ£Ðͱ£Ö¤¶ÔËùÓеÄÄÚ´æ¶Á/д²Ù×÷¶¼¾ßÓÐÔ×Ó
¡£
µÚÈý¸ö²îÒìÓë´¦ÀíÆ÷×ÜÏߵŤ×÷»úÖÆÃÜÇÐÏà¹Ø¡£ÔÚ¼ÆËã»úÖУ¬Êý¾Ýͨ¹ý×ÜÏßÔÚ´¦ÀíÆ÷ºÍÄÚ´æÖ®¼ä´«µÝ¡£Ã¿´Î´¦ÀíÆ÷ºÍÄÚ´æÖ®¼äµÄÊý¾Ý´«µÝ¶¼ÊÇͨ¹ý×ÜÏßÊÂÎñÀ´Íê³ÉµÄ¡£×ÜÏßÊÂÎñ°üÀ¨¶ÁÊÂÎñºÍдÊÂÎñ¡£¶ÁÊÂÎñ´ÓÄÚ´æ´«ËÍÊý¾Ýµ½´¦ÀíÆ÷£¬Ð´ÊÂÎñ´Ó´¦ÀíÆ÷´«µÝÊý¾Ýµ½Äڴ棬ÿ¸öÊÂÎñ»á¶Á£¯Ð´ÄÚ´æÖÐÒ»¸ö»ò¶à¸öÎïÀíÉÏÁ¬ÐøµÄ×Ö¡£×ÜÏß»áͬ²½ÊÔͼ²¢·¢Ê¹ÓÃ×ÜÏßµÄÊÂÎñ¡£ÔÚÒ»¸ö´¦ÀíÆ÷Ö´ÐÐ×ÜÏßÊÂÎñÆÚ¼ä£¬×ÜÏß»á½ûÖ¹ÆäËüËùÓеĴ¦ÀíÆ÷ºÍ
I£¯O É豸ִÐÐÄÚ´æµÄ¶Á£¯Ð´¡£
×ÜÏߵŤ×÷»úÖÆ£º

ÈçÉÏͼËùʾ£¬¼ÙÉè´¦ÀíÆ÷ A¡¢B¡¢ºÍ C ͬʱÏò×ÜÏß·¢Æð×ÜÏßÊÂÎñ£¬Õâʱ×ÜÏßÖٲûá¶Ô¾ºÕù×÷³ö²Ã¾ö£¬¼ÙÉè×ÜÏßÔÚÖٲúóÅж¨´¦ÀíÆ÷
A ÔÚ¾ºÕùÖлñʤ£¨×ÜÏßÖٲûáÈ·±£ËùÓд¦ÀíÆ÷¶¼Äܹ«Æ½µÄ·ÃÎÊÄڴ棩¡£´Ëʱ´¦ÀíÆ÷ A ¼ÌÐøËüµÄ×ÜÏßÊÂÎñ£¬¶øÆäËüÁ½¸ö´¦ÀíÆ÷ÔòÒªµÈ´ý´¦ÀíÆ÷
A µÄ×ÜÏßÊÂÎñÍê³Éºó²ÅÄÜ¿ªÊ¼ÔÙ´ÎÖ´ÐÐÄÚ´æ·ÃÎÊ¡£¼ÙÉèÔÚ´¦ÀíÆ÷ A Ö´ÐÐ×ÜÏßÊÂÎñÆÚ¼ä£¨²»¹ÜÕâ¸ö×ÜÏßÊÂÎñÊǶÁÊÂÎñ»¹ÊÇдÊÂÎñ£©£¬´¦ÀíÆ÷
D Ïò×ÜÏß·¢ÆðÁË×ÜÏßÊÂÎñ£¬´Ëʱ´¦ÀíÆ÷ D µÄÕâ¸öÇëÇó»á±»×ÜÏß½ûÖ¹¡£
×ÜÏßµÄÕâЩ¹¤×÷»úÖÆ¿ÉÒÔ°ÑËùÓд¦ÀíÆ÷¶ÔÄÚ´æµÄ·ÃÎÊÒÔ´®Ðл¯µÄ·½Ê½À´Ö´ÐУ»ÔÚÈÎÒâʱ¼äµã£¬×î¶àÖ»ÄÜÓÐÒ»¸ö´¦ÀíÆ÷ÄÜ·ÃÎÊÄÚ´æ¡£Õâ¸öÌØÐÔÈ·±£Á˵¥¸ö×ÜÏßÊÂÎñÖ®ÖеÄÄÚ´æ¶Á/д²Ù×÷¾ßÓÐÔ×ÓÐÔ¡£
ÔÚһЩ 32 λµÄ´¦ÀíÆ÷ÉÏ£¬Èç¹ûÒªÇó¶Ô 64 λÊý¾ÝµÄд²Ù×÷¾ßÓÐÔ×ÓÐÔ£¬»áÓбȽϴóµÄ¿ªÏú¡£ÎªÁËÕÕ¹ËÕâÖÖ´¦ÀíÆ÷£¬Java
ÓïÑԹ淶¹ÄÀøµ«²»Ç¿Çó JVM ¶Ô 64 λµÄ long ÐͱäÁ¿ºÍ double ÐͱäÁ¿µÄд¾ßÓÐÔ×ÓÐÔ¡£µ±
JVM ÔÚÕâÖÖ´¦ÀíÆ÷ÉÏÔËÐÐʱ£¬»á°ÑÒ»¸ö 64 λ long/ double ÐͱäÁ¿µÄд²Ù×÷²ð·ÖΪÁ½¸ö
32 λµÄд²Ù×÷À´Ö´ÐС£ÕâÁ½¸ö 32 λµÄд²Ù×÷¿ÉÄܻᱻ·ÖÅäµ½²»Í¬µÄ×ÜÏßÊÂÎñÖÐÖ´ÐУ¬´Ëʱ¶ÔÕâ¸ö 64
λ±äÁ¿µÄд½«²»¾ßÓÐÔ×ÓÐÔ¡£
µ±µ¥¸öÄÚ´æ²Ù×÷²»¾ßÓÐÔ×ÓÐÔ£¬½«¿ÉÄÜ»á²úÉúÒâÏë²»µ½ºó¹û¡£Çë¿´ÏÂÃæÊ¾Òâͼ£º

ÈçÉÏͼËùʾ£¬¼ÙÉè´¦ÀíÆ÷ A дһ¸ö long ÐͱäÁ¿£¬Í¬Ê±´¦ÀíÆ÷ B Òª¶ÁÕâ¸ö long ÐͱäÁ¿¡£´¦ÀíÆ÷
A ÖÐ 64 λµÄд²Ù×÷±»²ð·ÖΪÁ½¸ö 32 λµÄд²Ù×÷£¬ÇÒÕâÁ½¸ö 32 λµÄд²Ù×÷±»·ÖÅäµ½²»Í¬µÄдÊÂÎñÖÐÖ´ÐС£Í¬Ê±´¦ÀíÆ÷
B ÖÐ 64 λµÄ¶Á²Ù×÷±»·ÖÅäµ½µ¥¸öµÄ¶ÁÊÂÎñÖÐÖ´ÐС£µ±´¦ÀíÆ÷ A ºÍ B °´ÉÏͼµÄʱÐòÀ´Ö´ÐÐʱ£¬´¦ÀíÆ÷
B ½«¿´µ½½ö½ö±»´¦ÀíÆ÷ A ¡°Ð´ÁËÒ»°ë¡°µÄÎÞЧֵ¡£
×¢Ò⣬ÔÚ JSR -133 ֮ǰµÄ¾ÉÄÚ´æÄ£ÐÍÖУ¬Ò»¸ö 64 λ long/ double ÐͱäÁ¿µÄ¶Á/д²Ù×÷¿ÉÒÔ±»²ð·ÖΪÁ½¸ö
32 λµÄ¶Á/д²Ù×÷À´Ö´ÐС£´Ó JSR -133 ÄÚ´æÄ£ÐÍ¿ªÊ¼£¨¼´´ÓJDK5¿ªÊ¼£©£¬½ö½öÖ»ÔÊÐí°ÑÒ»¸ö
64 λ long/ double ÐͱäÁ¿µÄд²Ù×÷²ð·ÖΪÁ½¸ö 32 λµÄд²Ù×÷À´Ö´ÐУ¬ÈÎÒâµÄ¶Á²Ù×÷ÔÚJSR
-133Öж¼±ØÐë¾ßÓÐÔ×ÓÐÔ£¨¼´ÈÎÒâ¶Á²Ù×÷±ØÐëÒªÔÚµ¥¸ö¶ÁÊÂÎñÖÐÖ´ÐУ©¡£
Volatile
VOLATILE ÌØÐÔ
¾Ù¸öÀý×Ó£º
public class VolatileTest
{
volatile long a = 1L; // ʹÓà volatile ÉùÃ÷ 64 λµÄ
long ÐÍ
public void set(long l) {
a = l; //µ¥¸ö volatile ±äÁ¿µÄд
}
public long get() {
return a; //µ¥¸ö volatile ±äÁ¿µÄ¶Á
}
public void getAndIncreament() {
a++; // ¸´ºÏ£¨¶à¸ö£© volatile ±äÁ¿µÄ¶Á /д
}
}¡¡¡¡ |
¼ÙÉèÓжà¸öÏ̷ֱ߳ðµ÷ÓÃÉÏÃæ³ÌÐòµÄÈý¸ö·½·¨£¬Õâ¸ö³ÌÐòÔÚÓïÒåÉϺÍÏÂÃæ³ÌÐòµÈ¼Û£º
public class
VolatileTest {
long a = 1L; // 64 λµÄ long ÐÍÆÕͨ±äÁ¿
public synchronized void set(long l) { //¶Ôµ¥¸öÆÕͨ±äÁ¿µÄдÓÃͬһ¸öËøÍ¬²½
a = l;
}
public synchronized long get() { //¶Ôµ¥¸öÆÕͨ±äÁ¿µÄ¶ÁÓÃͬһ¸öËøÍ¬²½
return a;
}
public void getAndIncreament() { //ÆÕͨ·½·¨µ÷ÓÃ
long temp = get(); //µ÷ÓÃÒÑͬ²½µÄ¶Á·½·¨
temp += 1L; //ÆÕͨд²Ù×÷
set(temp); //µ÷ÓÃÒÑͬ²½µÄд·½·¨
}
} |
ÈçÉÏÃæÊ¾Àý³ÌÐòËùʾ£¬¶ÔÒ»¸ö volatile ±äÁ¿µÄµ¥¸ö¶Á/д²Ù×÷£¬Óë¶ÔÒ»¸öÆÕͨ±äÁ¿µÄ¶Á/д²Ù×÷ʹÓÃͬһ¸öËøÀ´Í¬²½£¬ËüÃÇÖ®¼äµÄÖ´ÐÐЧ¹ûÏàͬ¡£
ËøµÄ happens-before ¹æÔò±£Ö¤ÊÍ·ÅËøºÍ»ñÈ¡ËøµÄÁ½¸öÏß³ÌÖ®¼äµÄÄÚ´æ¿É¼ûÐÔ£¬ÕâÒâζ×ŶÔÒ»¸ö
volatile ±äÁ¿µÄ¶Á£¬×ÜÊÇÄÜ¿´µ½£¨ÈÎÒâỊ̈߳©¶ÔÕâ¸ö volatile ±äÁ¿×îºóµÄдÈë¡£
ËøµÄÓïÒå¾ö¶¨ÁËÁÙ½çÇø´úÂëµÄÖ´ÐоßÓÐÔ×ÓÐÔ¡£ÕâÒâζ׿´Ê¹ÊÇ 64 λµÄ long ÐÍºÍ double
ÐͱäÁ¿£¬Ö»ÒªËüÊÇ volatile±äÁ¿£¬¶Ô¸Ã±äÁ¿µÄ¶Áд¾Í½«¾ßÓÐÔ×ÓÐÔ¡£Èç¹ûÊǶà¸ö volatile
²Ù×÷»òÀàËÆÓÚ volatile++ ÕâÖÖ¸´ºÏ²Ù×÷£¬ÕâЩ²Ù×÷ÕûÌåÉϲ»¾ßÓÐÔ×ÓÐÔ¡£
¼ò¶øÑÔÖ®£¬volatile ±äÁ¿×ÔÉí¾ßÓÐÏÂÁÐÌØÐÔ£º
¿É¼ûÐÔ¡£¶ÔÒ»¸ö volatile ±äÁ¿µÄ¶Á£¬×ÜÊÇÄÜ¿´µ½£¨ÈÎÒâỊ̈߳©¶ÔÕâ¸ö volatile ±äÁ¿×îºóµÄдÈë¡£
Ô×ÓÐÔ£º¶ÔÈÎÒâµ¥¸ö volatile ±äÁ¿µÄ¶Á/д¾ßÓÐÔ×ÓÐÔ£¬µ«ÀàËÆÓÚ volatile++ ÕâÖÖ¸´ºÏ²Ù×÷²»¾ßÓÐÔ×ÓÐÔ¡£
VOLATILE д-¶ÁµÄÄڴ涨Òå
µ±Ð´Ò»¸ö volatile ±äÁ¿Ê±£¬JMM »á°Ñ¸ÃÏ̶߳ÔÓ¦µÄ±¾µØÄÚ´æÖеĹ²Ïí±äÁ¿ÖµË¢Ðµ½Ö÷ÄÚ´æ¡£
µ±¶ÁÒ»¸ö volatile ±äÁ¿Ê±£¬JMM »á°Ñ¸ÃÏ̶߳ÔÓ¦µÄ±¾µØÄÚ´æÖÃΪÎÞЧ¡£Ï߳̽ÓÏÂÀ´½«´ÓÖ÷ÄÚ´æÖжÁÈ¡¹²Ïí±äÁ¿¡£
¼ÙÉèÉÏÃæµÄ³ÌÐò flag ±äÁ¿Óà volatile ÐÞÊÎ

VOLATILE ÄÚ´æÓïÒåµÄʵÏÖ
ÏÂÃæÊÇ JMM Õë¶Ô±àÒëÆ÷ÖÆ¶¨µÄ volatile ÖØÅÅÐò¹æÔò±í£º

ΪÁËʵÏÖ volatile µÄÄÚ´æÓïÒ壬±àÒëÆ÷ÔÚÉú³É×Ö½ÚÂëʱ£¬»áÔÚÖ¸ÁîÐòÁÐÖвåÈëÄÚ´æÆÁÕÏÀ´½ûÖ¹ÌØ¶¨ÀàÐ͵Ĵ¦ÀíÆ÷ÖØÅÅÐò¡£
ÏÂÃæÊÇ»ùÓÚ±£ÊزßÂ﵀ JMM ÄÚ´æÆÁÕϲåÈë²ßÂÔ£º
ÔÚÿ¸ö volatile д²Ù×÷µÄÇ°Ãæ²åÈëÒ»¸ö StoreStore ÆÁÕÏ¡£
ÔÚÿ¸ö volatile д²Ù×÷µÄºóÃæ²åÈëÒ»¸ö StoreLoad ÆÁÕÏ¡£
ÔÚÿ¸ö volatile ¶Á²Ù×÷µÄºóÃæ²åÈëÒ»¸ö LoadLoad ÆÁÕÏ¡£
ÔÚÿ¸ö volatile ¶Á²Ù×÷µÄºóÃæ²åÈëÒ»¸ö LoadStore ÆÁÕÏ¡£
ÏÂÃæÊDZ£ÊزßÂÔÏ£¬volatile д²Ù×÷ ²åÈëÄÚ´æÆÁÕϺóÉú³ÉµÄÖ¸ÁîÐòÁÐʾÒâͼ£º

ÏÂÃæÊÇÔÚ±£ÊزßÂÔÏ£¬volatile ¶Á²Ù×÷ ²åÈëÄÚ´æÆÁÕϺóÉú³ÉµÄÖ¸ÁîÐòÁÐʾÒâͼ£º

ÉÏÊö volatile д²Ù×÷ºÍ volatile ¶Á²Ù×÷µÄÄÚ´æÆÁÕϲåÈë²ßÂԷdz£±£ÊØ¡£ÔÚʵ¼ÊÖ´ÐÐʱ£¬Ö»Òª²»¸Ä±ä
volatile д-¶ÁµÄÄÚ´æÓïÒ壬±àÒëÆ÷¿ÉÒÔ¸ù¾Ý¾ßÌåÇé¿öÊ¡ÂÔ²»±ØÒªµÄÆÁÕÏ¡£
Ëø
ËøÊͷźͻñÈ¡µÄÄÚ´æÓïÒå
µ±Ïß³ÌÊÍ·ÅËøÊ±£¬JMM »á°Ñ¸ÃÏ̶߳ÔÓ¦µÄ±¾µØÄÚ´æÖеĹ²Ïí±äÁ¿Ë¢Ðµ½Ö÷ÄÚ´æÖС£
µ±Ï̻߳ñÈ¡ËøÊ±£¬JMM »á°Ñ¸ÃÏ̶߳ÔÓ¦µÄ±¾µØÄÚ´æÖÃΪÎÞЧ¡£´Ó¶øÊ¹µÃ±»¼àÊÓÆ÷±£»¤µÄÁÙ½çÇø´úÂë±ØÐëÒª´ÓÖ÷ÄÚ´æÖÐÈ¥¶ÁÈ¡¹²Ïí±äÁ¿¡£
ËøÄÚ´æÓïÒåµÄʵÏÖ
½èÖú ReentrantLock À´½²½â£¬PS£º ºóÃæ×¨ÃŽ²ÏÂÕâ¿é£¨ReentrantLock¡¢Synchronized¡¢¹«Æ½Ëø¡¢·Ç¹«Æ½Ëø¡¢AQSµÈ£©£¬¿ÉÒÔ¿´¿´´óÃ÷¸çµÄ²©¿Í£ºhttp://cmsblogs.com/?p=2210
CONCURRENT °üµÄʵÏÖ
Èç¹ûÎÒÃÇ×Ðϸ·ÖÎö concurrent °üµÄÔ´´úÂëʵÏÖ£¬»á·¢ÏÖÒ»¸öͨÓû¯µÄʵÏÖģʽ£º
Ê×ÏÈ£¬ÉùÃ÷¹²Ïí±äÁ¿Îª volatile£»
È»ºó£¬Ê¹Óà CAS µÄÔ×ÓÌõ¼þ¸üÐÂÀ´ÊµÏÖÏß³ÌÖ®¼äµÄͬ²½£»
ͬʱ£¬ÅäºÏÒÔ volatile µÄ¶Á/дºÍ CAS Ëù¾ßÓÐµÄ volatile ¶ÁºÍдµÄÄÚ´æÓïÒåÀ´ÊµÏÖÏß³ÌÖ®¼äµÄͨÐÅ¡£
AQS£¬·Ç×èÈûÊý¾Ý½á¹¹ºÍÔ×Ó±äÁ¿Àࣨjava.util.concurrent.atomic °üÖеÄÀࣩ£¬ÕâЩ
concurrent °üÖеĻù´¡Àà¶¼ÊÇʹÓÃÕâÖÖģʽÀ´ÊµÏֵ쬶ø concurrent °üÖеĸ߲ãÀàÓÖÊÇÒÀÀµÓÚÕâЩ»ù´¡ÀàÀ´ÊµÏֵġ£´ÓÕûÌåÀ´¿´£¬concurrent
°üµÄʵÏÖʾÒâͼÈçÏ£º

final
¶ÔÓÚ final Óò£¬±àÒëÆ÷ºÍ´¦ÀíÆ÷Òª×ñÊØÁ½¸öÖØÅÅÐò¹æÔò£º
ÔÚ¹¹Ô캯ÊýÄÚ¶ÔÒ»¸ö final ÓòµÄдÈ룬ÓëËæºó°ÑÕâ¸ö±»¹¹Ôì¶ÔÏóµÄÒýÓø³Öµ¸øÒ»¸öÒýÓñäÁ¿£¬ÕâÁ½¸ö²Ù×÷Ö®¼ä²»ÄÜÖØÅÅÐò¡£
³õ´Î¶ÁÒ»¸ö°üº¬ final ÓòµÄ¶ÔÏóµÄÒýÓã¬ÓëËæºó³õ´Î¶ÁÕâ¸ö final Óò£¬ÕâÁ½¸ö²Ù×÷Ö®¼ä²»ÄÜÖØÅÅÐò¡£
д FINAL ÓòµÄÖØÅÅÐò¹æÔò
д final ÓòµÄÖØÅÅÐò¹æÔò½ûÖ¹°Ñ final ÓòµÄÐ´ÖØÅÅÐòµ½¹¹Ô캯ÊýÖ®Íâ¡£Õâ¸ö¹æÔòµÄʵÏÖ°üº¬ÏÂÃæ2¸ö·½Ã棺
JMM ½ûÖ¹±àÒëÆ÷°Ñ final ÓòµÄÐ´ÖØÅÅÐòµ½¹¹Ô캯ÊýÖ®Íâ¡£
±àÒëÆ÷»áÔÚ final ÓòµÄд֮ºó£¬¹¹Ô캯Êý return ֮ǰ£¬²åÈëÒ»¸ö StoreStore ÆÁÕÏ¡£Õâ¸öÆÁÕϽûÖ¹´¦ÀíÆ÷°Ñ
final ÓòµÄÐ´ÖØÅÅÐòµ½¹¹Ô캯ÊýÖ®Íâ¡£
¶Á FINAL ÓòµÄÖØÅÅÐò¹æÔò
ÔÚÒ»¸öÏß³ÌÖУ¬³õ´Î¶Á¶ÔÏóÒýÓÃÓë³õ´Î¶Á¸Ã¶ÔÏó°üº¬µÄ final Óò£¬JMM ½ûÖ¹´¦ÀíÆ÷ÖØÅÅÐòÕâÁ½¸ö²Ù×÷£¨×¢Ò⣬Õâ¸ö¹æÔò½ö½öÕë¶Ô´¦ÀíÆ÷£©¡£±àÒëÆ÷»áÔÚ¶Á
final Óò²Ù×÷µÄÇ°Ãæ²åÈëÒ»¸ö LoadLoad ÆÁÕÏ¡£
FINAL ÓòÊÇÒýÓÃÀàÐÍ
¶ÔÓÚÒýÓÃÀàÐÍ£¬Ð´ final ÓòµÄÖØÅÅÐò¹æÔò¶Ô±àÒëÆ÷ºÍ´¦ÀíÆ÷Ôö¼ÓÁËÈçÏÂÔ¼Êø£º
ÔÚ¹¹Ô캯ÊýÄÚ¶ÔÒ»¸ö final ÒýÓõĶÔÏóµÄ³ÉÔ±ÓòµÄдÈ룬ÓëËæºóÔÚ¹¹Ô캯ÊýÍâ°ÑÕâ¸ö±»¹¹Ôì¶ÔÏóµÄÒýÓø³Öµ¸øÒ»¸öÒýÓñäÁ¿£¬ÕâÁ½¸ö²Ù×÷Ö®¼ä²»ÄÜÖØÅÅÐò¡£
×ܽá
JMM£¬´¦ÀíÆ÷ÄÚ´æÄ£ÐÍÓë˳ÐòÒ»ÖÂÐÔÄÚ´æÄ£ÐÍÖ®¼äµÄ¹ØÏµ
JMM ÊÇÒ»¸öÓïÑÔ¼¶µÄÄÚ´æÄ£ÐÍ£¬´¦ÀíÆ÷ÄÚ´æÄ£ÐÍÊÇÓ²¼þ¼¶µÄÄÚ´æÄ£ÐÍ£¬Ë³ÐòÒ»ÖÂÐÔÄÚ´æÄ£ÐÍÊÇÒ»¸öÀíÂ۲ο¼Ä£ÐÍ¡£ÏÂÃæÊÇÓïÑÔÄÚ´æÄ£ÐÍ£¬´¦ÀíÆ÷ÄÚ´æÄ£ÐͺÍ˳ÐòÒ»ÖÂÐÔÄÚ´æÄ£Ð͵ÄÇ¿Èõ¶Ô±ÈʾÒâͼ£º

JMM µÄÉè¼ÆÊ¾Òâͼ

JMM µÄÄÚ´æ¿É¼ûÐÔ±£Ö¤
Java ³ÌÐòµÄÄÚ´æ¿É¼ûÐÔ±£Ö¤°´³ÌÐòÀàÐÍ¿ÉÒÔ·ÖΪÏÂÁÐÈýÀࣺ
1.µ¥Ï̳߳ÌÐò¡£µ¥Ï̳߳ÌÐò²»»á³öÏÖÄÚ´æ¿É¼ûÐÔÎÊÌâ¡£±àÒëÆ÷£¬runtime ºÍ´¦ÀíÆ÷»á¹²Í¬È·±£µ¥Ï̳߳ÌÐòµÄÖ´Ðнá¹ûÓë¸Ã³ÌÐòÔÚ˳ÐòÒ»ÖÂÐÔÄ£ÐÍÖеÄÖ´Ðнá¹ûÏàͬ¡£
2.Õýȷͬ²½µÄ¶àÏ̳߳ÌÐò¡£Õýȷͬ²½µÄ¶àÏ̳߳ÌÐòµÄÖ´Ðн«¾ßÓÐ˳ÐòÒ»ÖÂÐÔ£¨³ÌÐòµÄÖ´Ðнá¹ûÓë¸Ã³ÌÐòÔÚ˳ÐòÒ»ÖÂÐÔÄÚ´æÄ£ÐÍÖеÄÖ´Ðнá¹ûÏàͬ£©¡£ÕâÊÇ
JMM ¹Ø×¢µÄÖØµã£¬JMMͨ¹ýÏÞÖÆ±àÒëÆ÷ºÍ´¦ÀíÆ÷µÄÖØÅÅÐòÀ´Îª³ÌÐòÔ±ÌṩÄÚ´æ¿É¼ûÐÔ±£Ö¤¡£
3.δͬ²½/δÕýȷͬ²½µÄ¶àÏ̳߳ÌÐò¡£JMM ΪËüÃÇÌṩÁË×îС°²È«ÐÔ±£ÕÏ£ºÏß³ÌÖ´ÐÐʱ¶ÁÈ¡µ½µÄÖµ£¬ÒªÃ´ÊÇ֮ǰij¸öÏß³ÌдÈëµÄÖµ£¬ÒªÃ´ÊÇĬÈÏÖµ£¨0£¬null£¬false£©¡£
ÏÂͼչʾÁËÕâÈýÀà³ÌÐòÔÚ JMM ÖÐÓëÔÚ˳ÐòÒ»ÖÂÐÔÄÚ´æÄ£ÐÍÖеÄÖ´Ðнá¹ûµÄÒìͬ£º

|