Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
JavaÄÚ´æÄ£Ð͵ÄÉîÈëÀí½â
 
  2282  次浏览      27
 2018-12-6 
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ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 ÖÐÓëÔÚ˳ÐòÒ»ÖÂÐÔÄÚ´æÄ£ÐÍÖеÄÖ´Ðнá¹ûµÄÒìͬ£º

   
2282 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö