±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚjianshu£¬±¾ÎĽéÉÜÁ˲¢·¢±à³Ì¸ÅÄîÒÔ¼°JMMÄÚ´æÄ£ÐÍ¡¢ÄÚ´æ¼ä½»»¥²Ù×÷µÈÏà¹ØÄÚÈÝ¡£ |
|
1. ²¢·¢±à³Ì»ù´¡¸ÅÄî
²¢·¢¡ª¡ªÔÚ²Ù×÷ϵͳÖУ¬ÊÇÖ¸Ò»¸öʱ¼ä¶ÎÖÐÓм¸¸ö³ÌÐò¶¼´¦ÓÚÒÑÆô¶¯ÔËÐе½ÔËÐÐÍê±ÏÖ®¼ä£¬ÇÒÕ⼸¸ö³ÌÐò¶¼ÊÇÔÚͬһ¸ö´¦Àí»úÉÏÔËÐУ¬µ«ÈÎÒ»¸öʱ¿ÌµãÉÏÖ»ÓÐÒ»¸ö³ÌÐòÔÚ´¦Àí»úÉÏÔËÐСª¡ªÔ´×԰ٶȰٿÆ
ÔÚ²¢·¢±à³ÌÖУ¬ÎÒÃÇÐèÒª´¦ÀíÁ½¸ö¹Ø¼üÎÊÌ⣺Ïß³ÌÖ®¼äÈçºÎͨÐźÍÏß³ÌÖ®¼äÈçºÎͬ²½£¬ºóÐøÆªÕ½«Î§ÈÆÕâÁ½¸öÎÊÌâ½øÐнéÉÜ¡£
Ïß³ÌͨÐÅ£ºÊÇÖ¸Ïß³ÌÖ®¼äÒÔºÎÖÖ»úÖÆÀ´½»»»ÐÅÏ¢£¬ÔÚÃüÁîʽ±à³ÌÖУ¬Ïß³ÌÖ®¼äµÄͨÐÅ»úÖÆÓÐÁ½ÖÖ£º¹²ÏíÄÚ´æºÍÏûÏ¢´«µÝ¡£
Ïß³Ìͬ²½£ºÊÇÖ¸³ÌÐòÓÃÓÚ¿ØÖƲ»Í¬Ïß³ÌÖ®¼ä²Ù×÷·¢ÉúÏà¶Ô˳ÐòµÄ»úÖÆ¡£ÔÚJavaÖУ¬¿ÉÒÔͨ¹ývolatile£¬synchronized,
ËøµÈ·½Ê½ÊµÏÖͬ²½¡£
±¾ÎÄÖ÷Òª½éÉÜjavaµÄͨÐÅ»úÖÆ£¬¸Õ½éÉܳ£¼ûͨÐÅ»úÖÆÖ÷Òª°üÀ¨ÒÔÏÂÁ½ÖÖ·½Ê½£º¹²ÏíÄڴ棺Ïß³ÌÖ®¼ä¹²Ïí³ÌÐòµÄ¹«¹²×´Ì¬£¬Ïß³ÌÖ®¼äͨ¹ýд-¶ÁÄÚ´æÖеĹ«¹²×´Ì¬À´Òþʽ½øÐÐͨÐÅ¡£
ÏûÏ¢´«µÝ£ºÏß³ÌÖ®¼äûÓй«¹²×´Ì¬£¬Ïß³ÌÖ®¼ä±ØÐëͨ¹ýÃ÷È·µÄ·¢ËÍÏûÏ¢À´ÏÔʽ½øÐÐͨÐÅ¡£JavaµÄ²¢·¢²ÉÓõÄÊǹ²ÏíÄÚ´æÄ£ÐÍ£¬JavaÏß³ÌÖ®¼äµÄͨÐÅ×ÜÊÇÒþʽ½øÐУ¬Õû¸öͨÐŹý³Ì¶Ô³ÌÐòÔ±Íêȫ͸Ã÷¡£ÔÚjavaÖУ¬ËùÓÐʵÀýÓò¡¢¾²Ì¬ÓòºÍÊý×éÔªËØ´æ´¢ÔÚ¶ÑÄÚ´æÖУ¬¶ÑÄÚ´æÔÚÏß³ÌÖ®¼ä¹²Ïí¡£
JavaÏß³ÌÖ®¼äµÄͨÐÅÓÉJavaÄÚ´æÄ£ÐÍ£¨±¾Îļò³ÆÎªJMM£©¿ØÖÆ£¬JMM¾ö¶¨Ò»¸öÏ̶߳Թ²Ïí±äÁ¿µÄдÈëºÎʱ¶ÔÁíÒ»¸öÏ߳̿ɼû¡£
2. JMMÄÚ´æÄ£ÐÍ
JMM£¨Java Memory Model£©ÊÇJVM¹æ·¶Öж¨ÒåµÄÒ»ÖÖJavaÄÚ´æÄ£ÐÍ£¬ËüµÄÄ¿µÄÊÇÆÁ±Îµô¸÷ÖÖÓ²¼þºÍ²Ù×÷ϵͳµÄÄÚ´æ·ÃÎʲîÒ죬ÒÔʵÏÖÈÃJava³ÌÐòÔÚ¸÷ÖÖÆ½Ì¨Éϵ½ÄÜ´ïµ½Ò»ÖµÄÄÚ´æ·ÃÎÊЧ¹û¡£
JavaÄÚ´æÄ£Ð͵ÄÖ÷Òª¶¨Òå³ÌÐòÖи÷¸ö±äÁ¿µÄ·ÃÎʹæÔò£¬¼´ÔÚÐéÄâ»úÖн«±äÁ¿´æ´¢µ½ÄÚ´æºÍ´ÓÄÚ´æÖÐÈ¡³ö±äÁ¿ÕâÑùµ×²ãϸ½Ú¡£Ê×Ïȼòµ¥ËµÃ÷¼¸¸ö³£ÓÃÃû³Æ¶¨Ò壺±äÁ¿£ºÕâÀïÖ¸°üÀ¨ÁËʵÀý×ֶΡ¢¾²Ì¬×ֶκ͹¹³ÉÊý×é¶ÔÏóµÄÔªËØ£¬µ«ÊDz»°üÀ¨¾Ö²¿±äÁ¿Óë·½·¨²ÎÊý£¬ºóÕßÊÇÏß³Ì˽Óе쬲»»á±»¹²Ïí¡£
Ö÷Äڴ棺ÔÚjavaÖУ¬ÊµÀýÓò¡¢¾²Ì¬ÓòºÍÊý×éÔªËØÊÇÏß³ÌÖ®¼ä¹²ÏíµÄÊý¾Ý£¬ËüÃÇ´æ´¢ÔÚÖ÷ÄÚ´æÖС£
¹¤×÷Äڴ棺ÿÌõÏ̶߳¼ÓÐ×Ô¼ºµÄ¹¤×÷Äڴ棬Ï̵߳Ť×÷ÄÚ´æÖб£´æÁ˸ÃÏß³ÌʹÓõ½µÄ±äÁ¿µ½Ö÷Äڴ渱±¾¿½±´£¬Ï̶߳ԱäÁ¿µÄËùÓвÙ×÷£¨¶ÁÈ¡¡¢¸³Öµ£©¶¼±ØÐëÔÚ¹¤×÷ÄÚ´æÖнøÐУ¬¶ø²»ÄÜÖ±½Ó¶ÁдÖ÷ÄÚ´æÖеıäÁ¿¡£

Ï̡߳¢Ö÷ÄÚ´æºÍ¹¤×÷ÄÚ´æÖ®¼ä½»»¥¹ØÏµ
Ï̡߳¢Ö÷ÄÚ´æºÍ¹¤×÷ÄÚ´æµÄ½»»¥¹ØÏµÈçÉÏͼËùʾ£¬ºÍCPU-»º´æ-ÄÚ´æºÜÀàËÆ¡£
²»Í¬Ïß³ÌÖ®¼äÎÞ·¨Ö±½Ó·ÃÎʶԷ½¹¤×÷ÄÚ´æÖеıäÁ¿£¬Ï̼߳ä±äÁ¿ÖµµÄ´«µÝ¾ùÐèÒªÔÚÖ÷ÄÚ´æÀ´Íê³É¡£
×îºó×¢Ò⣬ΪÁË»ñµÃ½ÏºÃµÄÖ´ÐÐÐÔÄÜ£¬JavaÄÚ´æÄ£ÐͲ¢Ã»ÓÐÏÞÖÆÖ´ÐÐÒýÇæÊ¹Óô¦ÀíÆ÷µÄ¼Ä´æÆ÷»òÕ߸ßËÙ»º´æÀ´ÌáÉýÖ¸ÁîÖ´ÐÐËÙ¶È£¬Ò²Ã»ÓÐÏÞÖÆ±àÒëÆ÷¶ÔÖ¸Áî½øÐÐÖØÅÅÐò¡£Ò²¾ÍÊÇ˵£¬ÔÚjavaÄÚ´æÄ£ÐÍÖУ¬Ò²»á´æÔÚ»º´æÒ»ÖÂÐÔÎÊÌâºÍÖ¸ÁîÖØÅÅÐòµÄÎÊÌâ¡£
3. ÄÚ´æ¼ä½»»¥²Ù×÷
¹ØÓÚÖ÷ÄÚ´æÓ빤×÷ÄÚ´æÖ®¼äµÄ¾ßÌå½»»¥ÐÒ飬¼´Ò»¸ö±äÁ¿ÈçºÎ´ÓÖ÷Äڴ濽±´µ½¹¤×÷ÄÚ´æ¡¢ÈçºÎ´Ó¹¤×÷ÄÚ´æÍ¬²½µ½Ö÷ÄÚ´æÖ®¼äµÄʵÏÖϸ½Ú£¬JavaÄÚ´æÄ£ÐͶ¨ÒåÁËÒÔϰËÖÖ²Ù×÷À´Íê³É£º
lock£¨Ëø¶¨£©£º×÷ÓÃÓÚÖ÷ÄÚ´æµÄ±äÁ¿£¬°ÑÒ»¸ö±äÁ¿±êʶΪһÌõÏ̶߳Àռ״̬¡£
unlock£¨½âËø£©£º×÷ÓÃÓÚÖ÷ÄÚ´æ±äÁ¿£¬°ÑÒ»¸ö´¦ÓÚËø¶¨×´Ì¬µÄ±äÁ¿ÊͷųöÀ´£¬ÊͷźóµÄ±äÁ¿²Å¿ÉÒÔ±»ÆäËûÏß³ÌËø¶¨¡£
read£¨¶ÁÈ¡£©£º×÷ÓÃÓÚÖ÷ÄÚ´æ±äÁ¿£¬°ÑÒ»¸ö±äÁ¿Öµ´ÓÖ÷ÄÚ´æ´«Êäµ½Ï̵߳Ť×÷ÄÚ´æÖУ¬ÒÔ±ãËæºóµÄload¶¯×÷ʹÓÃ
load£¨ÔØÈ룩£º×÷ÓÃÓÚ¹¤×÷ÄÚ´æµÄ±äÁ¿£¬Ëü°Ñread²Ù×÷´ÓÖ÷ÄÚ´æÖеõ½µÄ±äÁ¿Öµ·ÅÈ빤×÷ÄÚ´æµÄ±äÁ¿¸±±¾ÖС£
use£¨Ê¹Óã©£º×÷ÓÃÓÚ¹¤×÷ÄÚ´æµÄ±äÁ¿£¬°Ñ¹¤×÷ÄÚ´æÖеÄÒ»¸ö±äÁ¿Öµ´«µÝ¸øÖ´ÐÐÒýÇæ£¬Ã¿µ±ÐéÄâ»úÓöµ½Ò»¸öÐèҪʹÓñäÁ¿µÄÖµµÄ×Ö½ÚÂëÖ¸Áîʱ½«»áÖ´ÐÐÕâ¸ö²Ù×÷¡£
assign£¨¸³Öµ£©£º×÷ÓÃÓÚ¹¤×÷ÄÚ´æµÄ±äÁ¿£¬Ëü°ÑÒ»¸ö´ÓÖ´ÐÐÒýÇæ½ÓÊÕµ½µÄÖµ¸³Öµ¸ø¹¤×÷ÄÚ´æµÄ±äÁ¿£¬Ã¿µ±ÐéÄâ»úÓöµ½Ò»¸ö¸ø±äÁ¿¸³ÖµµÄ×Ö½ÚÂëÖ¸ÁîʱִÐÐÕâ¸ö²Ù×÷¡£
store£¨´æ´¢£©£º×÷ÓÃÓÚ¹¤×÷ÄÚ´æµÄ±äÁ¿£¬°Ñ¹¤×÷ÄÚ´æÖеÄÒ»¸ö±äÁ¿µÄÖµ´«Ë͵½Ö÷ÄÚ´æÖУ¬ÒÔ±ãËæºóµÄwriteµÄ²Ù×÷¡£
write£¨Ð´È룩£º×÷ÓÃÓÚÖ÷ÄÚ´æµÄ±äÁ¿£¬Ëü°Ñstore²Ù×÷´Ó¹¤×÷ÄÚ´æÖÐÒ»¸ö±äÁ¿µÄÖµ´«Ë͵½Ö÷ÄÚ´æµÄ±äÁ¿ÖС£
ËùÒÔ±äÁ¿¶Áд°üº¬ÒÔϼ¸¸ö²½Ö裺
±äÁ¿´ÓÖ÷ÄÚ´æ¸´ÖÆµ½¹¤×÷Äڴ桪¡ªË³ÐòÖ´ÐÐreadºÍload²Ù×÷
±äÁ¿´Ó¹¤×÷ÄÚ´æÍ¬²½µ½Ö÷Äڴ桪¡ªË³ÐòÖ´ÐÐstoreºÍwrite²Ù×÷
×¢Ò⣬JavaÄÚ´æÄ£ÐÍÖ»ÒªÇóÉÏÊö²Ù×÷±ØÐ밴˳ÐòÖ´ÐУ¬¶øÃ»Óб£Ö¤±ØÐëÊÇÁ¬ÐøÖ´ÐС£Ò²¾ÍÊÇreadºÍloadÖ®¼ä£¬storeºÍwriteÖ®¼äÊÇ¿ÉÒÔ²åÈëÆäËûÖ¸ÁîµÄ¡£
³ýÁ˶¨ÒåÒÔÉÏ8ÖÐÔ×Ó²Ù×÷£¬JavaÄÚ´æÄ£ÐÍ»¹¹æ¶¨ÁËÉÏÊö8ÖÖ»ù±¾²Ù×÷ÔÚÖ´ÐÐʱ±ØÐëÂú×ãÒ»¶¨µÄ²Ù×÷¹æÔò£¬ÀýÈçÈç²»ÔÊÐíreadºÍloadµ¥¶À³öÏÖ£¨¼´²»ÔÊÐíÒ»¸ö±äÁ¿´ÓÖ÷ÄÚ´æÖжÁÈ¡µ«¹¤×÷ÄÚ´æ²»½ÓÊÜ£©£¬²»ÔÊÐístoreºÍwriteµ¥¶À³öÏÖ£¨¼´²»ÔÊÐí´Ó¹¤×÷ÄÚ´æÖз¢ÆðÁË»ØÐ´µ¥Ö÷ÄÚ´æ²»½ÓÊÜ£©£¬ÕâÀï²»Ò»Ò»Áо٣¬ÏêÏ¸ÍøÉÏËÑË÷¼´¿É¡£
JavaÄÚ´æÄ£ÐÍ»¹¶¨ÒåÁËvolatileÐͱäÁ¿µÄÌØÊâ¹æÔò£¨ÏÂÒ»½Ú½éÉÜ£©£¬ÒÔÉÏÈýÖֹ涨¹²Í¬È·¶¨ÁËJavaÖÐÄÄЩÄÚ´æ·ÃÎʲÙ×÷Êǰ²È«µÄ¼´£º
8ÖÖÔ×Ó²Ù×÷+²Ù×÷¹æÔò+volatile¹æ¶¨=JavaÖÐÄÄЩÄÚ´æ·ÃÎʲÙ×÷Êǰ²È«µÄ
4. volatileÐͱäÁ¿¹æ¶¨
µ±Ò»¸ö±äÁ¿±»¶¨ÒåΪvolatileºó£¬½«¾ß±¸Á½ÖÖÌØÐÔ£º
ÌØÐÔÒ»£º±£Ö¤´Ë±äÁ¿¶ÔËùÓÐÏ̵߳ĿɼûÐÔ
ÌØÐÔ¶þ£º½ûÖ¹Ö¸ÁîÖØÅÅÐòÓÅ»¯
4.1 volatile¿É¼ûÐÔ
¿É¼ûÐÔÊÇÖ¸µ±¶à¸öÏ̷߳ÃÎÊͬһ¸ö±äÁ¿Ê±£¬Ò»¸öÏß³ÌÐÞ¸ÄÁËÕâ¸ö±äÁ¿µÄÖµ£¬ÆäËûÏß³ÌÄܹ»Á¢¼´¿´µÃµ½Ð޸ĵÄÖµ¡£
ÆÕͨµÄ¹²Ïí±äÁ¿²»Äܱ£Ö¤¿É¼ûÐÔ£¬ÒòΪÆÕͨ¹²Ïí±äÁ¿±»ÐÞ¸ÄÖ®ºó£¬Ê²Ã´Ê±ºò±»Ð´ÈëÖ÷´æÊDz»È·¶¨µÄ£¬µ±ÆäËûÏß³ÌÈ¥¶Áȡʱ£¬´ËʱÄÚ´æÖпÉÄÜ»¹ÊÇÔÀ´µÄ¾ÉÖµ£¬Òò´ËÎÞ·¨±£Ö¤¿É¼ûÐÔ¡£
µ«ÊÇ£¬ÐèҪעÒâµÄÊÇvolatile±äÁ¿Ö»±£Ö¤¿É¼ûÐÔ£¬µ«ÊÇjavaÀïÃæµÄÔËËã²¢·ÇÈ«²¿¶¼ÊÇÔ×Ó²Ù×÷ÀýÈç++²Ù×÷£¬ÕâÑùͬÑùµ¼ÖÂvolatileÐÞÊαäÁ¿javaÔËËã²»°²È«¡£
Ò»°ã²»·ûºÏÒÔÏÂÁ½Ìõ¹æÔòµÄÔËË㳡¾°ÖУ¬ÎÒÃÇÐèҪͨ¹ý¼ÓËø£¨synchronized»ò²¢·¢°üÖеÄËø£©±£Ö¤±äÁ¿Ô×ÓÐÔ£º
ÔËËã½á¹û²¢²»ÒÀÀµ±äÁ¿µÄµ±Ç°Öµ£¬»òÕßÄܹ»È·±£Ö»Óе¥Ò»µÄÏß³ÌÐ޸ıäÁ¿µÄÖµ£¨±ÈÈç++²Ù×÷²»·ûºÏÒÀÀµµ±Ç°Öµ£©
±äÁ¿²»ÐèÒªÓëÆäËû״̬±äÁ¿¹²Í¬²ÎÓë²»±äÔ¼Êø
³£¼ûµÄvolatileÐÞÊαäÁ¿µÄ³¡¾°ÊÇÓÃÀ´×÷Ϊ¿ª¹Ø¿ØÖƲ¢·¢£º

volatile¿ª¹Ø
4.2 ½ûÖ¹Ö¸ÁîÖØÅÅÐò
ÖØÅÅÐò£ºÊÇÖ¸¡°±àÒëÆ÷ºÍ´¦ÀíÆ÷¡±ÎªÁËÌá¸ßÐÔÄÜ£¬¶øÔÚ³ÌÐòÖ´ÐÐʱ»á¶Ô³ÌÐò½øÐеÄÖØÅÅÐò¡£´óÖ¿ÉÒÔ·ÖΪÒÔÏÂÈýÀࣺ±àÒëÆ÷ÓÅ»¯Ö¸ÁîÖØÅÅ£¬²»¸Ä±äµ¥Ïß³ÌÓïÒåµÄÇé¿öÏ£¬ÖØÐ°²ÅÅÖ¸ÁîÖ´ÐеÄ˳Ðò¡£
Ö¸Áî¼¶²¢ÐÐÖØÅÅÐò£¬¸ÃÓÅ»¯Ö÷ÒªÊÇΪÁËÈóÌÐò·¢»ÓÏÖ´ú´¦ÀíÆ÷µÄÖ¸Áî¼¶²¢ÐÐÖ´ÐÐÄÜÁ¦£¬Ç°ÌáÊÇÕâЩÓï¾ä²»´æÔÚÊý¾ÝÒÀÀµ¡£
ÄÚ´æÏµÍ³ÖØÅÅÐò£¬Ö÷Òª·¢ÉúÔÚ´¦ÀíÆ÷¶Áд»º³åÇø£¬¶Áд¹ý³Ì¿´ÆðÀ´ÊÇÎÞÐòµÄ£¬µ«×îÖÕ½á¹ûÊÇÓÐÐòµÄ
´ÓJavaÔ´´úÂëµ½×îÖÕʵ¼ÊÖ´ÐеÄÖ¸ÁîÐòÁУ¬»á¾¹ýÏÂÃæÈýÖÖÖØÅÅÐò£º

ʵ¼ÊÖ´ÐÐÖ¸ÁîÐòÁÐ
ÒÔÉÏÖØÅÅÐò¿ÉÄܻᵼÖ¶àÏß³ÌÖгöÏÖÄÚ´æ¿É¼ûÐÔÎÊÌ⣬Õë¶Ô±àÒëÆ÷ÖØÅÅÐòJMMµÄ±àÒëÆ÷ÖØÅÅÐò¹æÔò»á½ûÖ¹ÌØ¶¨ÀàÐ͵ıàÒëÆ÷ÖØÅÅÐò¡£
¶ø¶ÔÓÚºóÁ½ÖÖÖØÅÅÐò£¬JMMµÄ´¦ÀíÆ÷ÖØÅÅÐò¹æÔò»áÒªÇójava±àÒëÆ÷ÔÚÉú³ÉÖ¸ÁîÐòÁÐʱ£¬²åÈëÌØ¶¨ÀàÐ͵ÄÄÚ´æÆÁÕÏ£¨memory
barriers£¬intel³ÆÖ®Îªmemory fence£©Ö¸Áͨ¹ýÄÚ´æÆÁÕÏÖ¸ÁîÀ´½ûÖ¹ÌØ¶¨ÀàÐ͵Ĵ¦ÀíÆ÷ÖØÅÅÐò£¨²»ÊÇËùÓеĴ¦ÀíÆ÷ÖØÅÅÐò¶¼Òª½ûÖ¹£©¡£
ÏÂÃæÎÒÃÇ¿´ÏÂjvmÈçºÎʵÏÖvolatile½ûÖ¹Ö¸ÁîÖØÅÅÐòµÄ£º
volatile±äÁ¿Ð´²Ù×÷£¬jvm»áÏò´¦ÀíÆ÷·¢ËÍÒ»ÌõLockǰ׺ÃüÁ½«±äÁ¿ËùÔڵĻº´æÐÐϵ»áµ½ÏµÍ³ÄÚ´æ¡£ÆäËû´¦ÀíÆ÷ͨ¹ýÐá̽×ÜÏßÉÏ´«²¥µÄÊý¾Ý¼ì²â×Ô¼ºµÄÊý¾ÝÊÇ·ñ¹ýÆÚ£¬Èç¹û·¢ÏÖ¹ýÆÚ»áÖÃΪÎÞЧ£¬ÔÙ´ÎʹÓÃʱ»á´ÓϵͳÄÚ´æ»ñÈ¡
Lockǰ׺ÃüÁî½ûÖ¹¸ÃÖ¸ÁîÓë֮ǰºÍÖ®ºóµÄ¶ÁºÍдָÁîÖØÅÅÐò¡£
×îºó£¬¹ØÓÚvolatile½ûÖ¹ÖØÅÅÐò¼¸µãʹÓÃ˵Ã÷£º
²»»á¶Ôvolatile¶ÁÓëvolatile¶ÁºóÃæµÄÈÎÒâÄÚ´æ²Ù×÷ÖØÅÅÐò
²»»á¶ÔvolatileдÓëvolatileд֮ǰµÄÈÎÒâÄÚ´æ²Ù×÷ÖØÅÅÐò
CASͬʱ¾ßÓÐvolatile¶ÁºÍдÄÚ´æµÄÓïÒ壬javaµÄCASʹÓÃÏÖ´ú´¦ÀíÆ÷ÌṩµÄ¸ßЧ¼¶±ðµÄÔ×ÓÖ¸ÁÕâЩÔ×ÓÖ¸ÁîÒÔÔ×Ó·½Ê½¶ÔÄÚ´æÖ´ÐжÁ-¸Ä-д²Ù×÷£¬ÕâÊǶദÀíÆ÷ÖÐʵÏÖͬ²½µÄ¹Ø¼ü¡£
5. JMMÄÚ´æÄ£ÐÍ×ܽá
×ܵÄÀ´ËµJMMÄÚ´æÄ£ÐÍÊÇÎ§ÈÆ×ÅÔÚ²¢·¢¹ý³ÌÖÐÈçºÎ´¦ÀíÔ×ÓÐÔ¡¢¿É¼ûÐÔºÍÓÐÐòÐÔÈý¸öÌØÕ÷À´½¨Á¢µÄ¡£ÏÂÃæ¾ÍÈý¸öÌØÕ÷·Ö±ð˵Ã÷£º
5.1 Ô×ÓÐÔ
Ô×ÓÐÔ£º¼´Ò»¸ö²Ù×÷»òÕß¶à¸ö²Ù×÷ Ҫôȫ²¿Ö´Ðв¢ÇÒÖ´ÐеĹý³Ì²»»á±»ÈκÎÒòËØ´ò¶Ï£¬ÒªÃ´¾Í¶¼²»Ö´ÐС£
javaÄÚ´æÄ£Ð͵Äread¡¢load¡¢assign¡¢use¡¢storeºÍwriteÁù¸ö²Ù×÷Ö±½Ó±£Ö¤Ô×ÓÐÔ£¬ÎÒÃÇ¿ÉÒÔÈÎÎñ»ù±¾Êý¾ÝÀàÐÍ·ÃÎʶÁдÊǾßÓÐÔ×ÓÐÔ£¨ÌØÊâ˵Ã÷long
double64λ²Ù×÷¸ù¾ÝjvmʵÏÖÓйأ©¡£
Èç¹û³¡¾°ÖÐÐèÒª´ó·¶Î§µÄÔ×ÓÐÔ±£Ö¤£¬javaÄÚ´æÄ£ÐÍÌṩÁËlockºÍunlock²Ù×÷À´Âú×㣬¶ÔÓ¦µ½java´úÂë¹Ø¼ü×Ö¼´ÊÇ¡ª¡ªsynchronized¡£
5.2 ¿É¼ûÐÔ
¿É¼ûÐÔÊÇÖ¸µ±¶à¸öÏ̷߳ÃÎÊͬһ¸ö±äÁ¿Ê±£¬Ò»¸öÏß³ÌÐÞ¸ÄÁËÕâ¸ö±äÁ¿µÄÖµ£¬ÆäËûÏß³ÌÄܹ»Á¢¼´¿´µÃµ½Ð޸ĵÄÖµ¡£
³ýÁËÉÏÃæ½éÉܵÄvolatileÍ⣬java»¹ÌṩÁËÁ½¸ö¹Ø¼ü×ÖʵÏֿɼûÐÔ£¬synchronizedºÍfinal¡£finalµÄ¿É¼ûÐÔ£ºÊÇÖ¸±»finalÐÞÊεÄ×Ö¶ÎÔÚ¹¹ÔìÆ÷ÖÐÒ»µ©Íê³É£¬ÄÇôÔÚÆäËûÏ߳̾ͿÉÒÔ¿´¼ûfinal×Ö¶ÎÖµsynchronized¿É¼ûÐÔ£ºÊÇÖ¸¶ÔÒ»¸ö±äÁ¿Ö´ÐÐunlock²Ù×÷֮ǰ£¬±ØÐëÏȰѴαäÁ¿Í¬²½»áÖ÷ÄÚ´æÕâÌõ²Ù×÷¹æÔòÏÞÖÆ
5.3 ÓÐÐòÐÔ
ÓÐÐòÐÔ£º¼´³ÌÐòÖ´ÐеÄ˳Ðò°´ÕÕ´úÂëµÄÏȺó˳ÐòÖ´ÐС£
javaÖÐÌìÈ»ÓÐÐòÐÔ¿ÉÒÔ×ܽáΪһ¾ä»°£ºÈç¹ûÔÚ±¾Ïß³ÌÄڹ۲죬ËùÓеIJÙ×÷¶¼ÊÇÓÐÐòµÄ£»Èç¹ûÔÚÒ»¸öÏß³ÌÖй۲ìÁíÍâÒ»¸öỊ̈߳¬ËùÓвÙ×÷¶¼ÊÇÎÞÐòµÄ¡£Ç°°ë¾äÊÇÖ¸¡°Ïß³ÌÄÚ±íÏÖΪ´®ÐÐÓïÒ塱£¬ºó°ë¾ä±íʾ¡°Ö¸ÁîÖØÅÅ¡±ºÍ¡°¹¤×÷ÄÚ´æÓëÖ÷ÄÚ´æÍ¬²½ÑÓ³Ù¡±ÏÖÏó¡£
javaÌṩÁËvolatileºÍsynchronizedÁ½¸ö¹Ø¼ü×ÖÀ´±£Ö¤Ïß³ÌÖ®¼ä²Ù×÷µÄÓÐÐòÐÔ£¬ÕâÀïsynchronizedÔòÊÇÓС°Í¬Ò»Ê±¿ÌÖ»ÔÊÐíÒ»ÌõÏß³Ì¶ÔÆä½øÐÐlock²Ù×÷¡±ÕâÌõ²Ù×÷¹æ¶¨»ñÈ¡µÄ£¬Õâ¸ö¹æÔò¾ö¶¨ÁËͬһ¸öËøµÄÁ½¸öͬ²½¿éÖ»ÄÜ´®ÐнøÈë¡£
×îºó£¬¿ÉÒÔ·¢ÏÖsynchronized¹Ø¼ü×Ö¿ÉÒÔͬʱ½â¾öÉÏÊöÈý¸öÎÊÌ⣬µ±È»Õâ¸öÐèÒª¸¶³ö´ú¼Û¾ÍÊÇÐÔÄÜÎÊÌâ¡£
|