±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcnblogs£¬±¾ÎĽéÉÜÁËJavaÔËÐÐʱÊý¾ÝʱµÄÄÚ´æÇøÓòÒÔ¼°Ö÷ÄÚ´æºÍ¹¤×÷ÄÚ´æµÈÏà¹ØÄÚÈÝ¡£ |
|
ÔÚ²¢·¢±à³ÌÖУ¬¶à¸öÏß³ÌÖ®¼ä²Éȡʲô»úÖÆ½øÐÐͨÐÅ£¨ÐÅÏ¢½»»»£©£¬Ê²Ã´»úÖÆ½øÐÐÊý¾ÝµÄͬ²½£¿
ÔÚJavaÓïÑÔÖУ¬²ÉÓõÄÊǹ²ÏíÄÚ´æÄ£ÐÍÀ´ÊµÏÖ¶àÏß³ÌÖ®¼äµÄÐÅÏ¢½»»»ºÍÊý¾Ýͬ²½µÄ¡£
Ïß³ÌÖ®¼äͨ¹ý¹²Ïí³ÌÐò¹«¹²µÄ״̬£¬Í¨¹ý¶Á-дÄÚ´æÖй«¹²×´Ì¬µÄ·½Ê½À´½øÐÐÒþʽµÄͨÐÅ¡£Í¬²½Ö¸µÄÊdzÌÐòÔÚ¿ØÖƶà¸öÏß³ÌÖ®¼äÖ´ÐгÌÐòµÄÏà¶Ô˳ÐòµÄ»úÖÆ£¬ÔÚ¹²ÏíÄÚ´æÄ£ÐÍÖУ¬Í¬²½ÊÇÏÔʽµÄ£¬³ÌÐòÔ±±ØÐëÏÔʽָ¶¨Ä³¸ö·½·¨/´úÂë¿éÐèÒªÔÚ¶àÏß³ÌÖ®¼ä»¥³âÖ´ÐС£
ÔÚ˵JavaÄÚ´æÄ£ÐÍ֮ǰ£¬ÎÒÃÇÏÈ˵һÏÂJavaµÄÄÚ´æ½á¹¹£¬Ò²¾ÍÊÇÔËÐÐʱµÄÊý¾ÝÇøÓò£º
JavaÐéÄâ»úÔÚÖ´ÐÐJava³ÌÐòµÄ¹ý³ÌÖУ¬»á°ÑËü¹ÜÀíµÄÄÚ´æ»®·ÖΪ¼¸¸ö²»Í¬µÄÊý¾ÝÇøÓò£¬ÕâÐ©ÇøÓò¶¼Óи÷×ÔµÄÓÃ;¡¢´´½¨Ê±¼ä¡¢Ïú»Ùʱ¼ä¡£
JavaÔËÐÐʱÊý¾ÝÇø·ÖΪÏÂÃæ¼¸¸öÄÚ´æÇøÓò£º
1.PC¼Ä´æÆ÷/³ÌÐò¼ÆÊýÆ÷£º
ÑϸñÀ´ËµÊÇÒ»¸öÊý¾Ý½á¹¹£¬ÓÃÓÚ±£´æµ±Ç°ÕýÔÚÖ´ÐеijÌÐòµÄÄÚ´æµØÖ·£¬ÓÉÓÚJavaÊÇÖ§³Ö¶àÏß³ÌÖ´Ðеģ¬ËùÒÔ³ÌÐòÖ´ÐеĹ켣²»¿ÉÄÜÒ»Ö±¶¼ÊÇÏßÐÔÖ´ÐС£µ±Óжà¸öÏ߳̽»²æÖ´ÐÐʱ£¬±»ÖжϵÄÏ̵߳ijÌÐòµ±Ç°Ö´Ðе½ÄÄÌõÄÚ´æµØÖ·±ØÈ»Òª±£´æÏÂÀ´£¬ÒÔ±ãÓÃÓÚ±»ÖжϵÄÏָ̻߳´Ö´ÐÐʱÔÙ°´ÕÕ±»ÖжÏʱµÄÖ¸ÁîµØÖ·¼ÌÐøÖ´ÐÐÏÂÈ¥¡£ÎªÁËÏß³ÌÇл»ºóÄָܻ´µ½ÕýÈ·µÄÖ´ÐÐλÖã¬Ã¿¸öÏ̶߳¼ÐèÒªÓÐÒ»¸ö¶ÀÁ¢µÄ³ÌÐò¼ÆÊýÆ÷£¬¸÷¸öÏß³ÌÖ®¼ä¼ÆÊýÆ÷»¥²»Ó°Ï죬¶ÀÁ¢´æ´¢£¬ÎÒÃdzÆÕâÀàÄÚ´æÇøÓòΪ¡°Ïß³Ì˽ÓС±µÄÄÚ´æ,ÕâÔÚijÖ̶ֳÈÉÏÓеãÀàËÆÓÚ¡°ThreadLocal¡±£¬ÊÇḬ̈߳²È«µÄ¡£
2.JavaÕ» Java Stack£º
JavaÕ»×ÜÊÇÓëÏ̹߳ØÁªÔÚÒ»ÆðµÄ£¬Ã¿µ±´´½¨Ò»¸öỊ̈߳¬JVM¾Í»áΪ¸ÃÏ̴߳´½¨¶ÔÓ¦µÄJavaÕ»£¬ÔÚÕâ¸öJavaÕ»ÖÐÓÖ»á°üº¬¶à¸öÕ»Ö¡(Stack
Frame)£¬ÕâЩջ֡ÊÇÓëÿ¸ö·½·¨¹ØÁªÆðÀ´µÄ£¬Ã¿ÔËÐÐÒ»¸ö·½·¨¾Í´´½¨Ò»¸öÕ»Ö¡£¬Ã¿¸öÕ»Ö¡»áº¬ÓÐһЩ¾Ö²¿±äÁ¿¡¢²Ù×÷Õ»ºÍ·½·¨·µ»ØÖµµÈÐÅÏ¢¡£Ã¿µ±Ò»¸ö·½·¨Ö´ÐÐÍê³Éʱ£¬¸ÃÕ»Ö¡¾Í»áµ¯³öÕ»Ö¡µÄÔªËØ×÷ΪÕâ¸ö·½·¨µÄ·µ»ØÖµ£¬²¢ÇÒÇå³ýÕâ¸öÕ»Ö¡£¬JavaÕ»µÄÕ»¶¥µÄÕ»Ö¡¾ÍÊǵ±Ç°ÕýÔÚÖ´ÐеĻջ£¬Ò²¾ÍÊǵ±Ç°ÕýÔÚÖ´Ðеķ½·¨£¬PC¼Ä´æÆ÷Ò²»áÖ¸Ïò¸ÃµØÖ·¡£Ö»ÓÐÕâ¸ö»î¶¯µÄÕ»Ö¡µÄ±¾µØ±äÁ¿¿ÉÒÔ±»²Ù×÷ջʹÓ㬵±ÔÚÕâ¸öÕ»Ö¡Öе÷ÓÃÁíÍâÒ»¸ö·½·¨Ê±£¬ÓëÖ®¶ÔÓ¦µÄÒ»¸öеÄÕ»Ö¡±»´´½¨£¬Õâ¸öд´½¨µÄÕ»Ö¡±»·Åµ½JavaÕ»µÄÕ»¶¥£¬±äΪµ±Ç°µÄ»î¶¯Õ»¡£Í¬ÑùÏÖÔÚÖ»ÓÐÕâ¸öÕ»µÄ±¾µØ±äÁ¿²ÅÄܱ»Ê¹Ó㬵±Õâ¸öÕ»Ö¡ÖÐËùÓÐÖ¸Áî¶¼Íê³Éʱ£¬Õâ¸öÕ»Ö¡±»ÒƳýJavaÕ»£¬¸Õ²ÅµÄÄǸöÕ»Ö¡±äΪ»î¶¯Õ»Ö¡£¬Ç°ÃæÕ»Ö¡µÄ·µ»ØÖµ±äΪÕâ¸öÕ»Ö¡µÄ²Ù×÷Õ»µÄÒ»¸ö²Ù×÷Êý¡£
ÓÉÓÚJavaÕ»ÊÇÓëÏ̶߳ÔÓ¦ÆðÀ´µÄ£¬JavaÕ»Êý¾Ý²»ÊÇÏ̹߳²Óеģ¬ËùÒÔ²»ÐèÒª¹ØÐÄÆäÊý¾ÝÒ»ÖÂÐÔ£¬Ò²²»»á´æÔÚͬ²½ËøµÄÎÊÌâ¡£
ÔÚJavaÐéÄâ»ú¹æ·¶ÖУ¬¶ÔÕâ¸öÇøÓò¹æ¶¨ÁËÁ½ÖÖÒì³£×´¿ö£ºÈç¹ûÏß³ÌÇëÇóµÄÕ»Éî¶È´óÓÚÐéÄâ»úËùÔÊÐíµÄÉî¶È£¬½«Å׳öStackOverflowErrorÒì³££»Èç¹ûÐéÄâ»ú¿ÉÒÔ¶¯Ì¬À©Õ¹£¬Èç¹ûÀ©Õ¹Ê±ÎÞ·¨ÉêÇëµ½×ã¹»µÄÄڴ棬¾Í»áÅ׳öOutOfMemoryErrorÒì³£¡£ÔÚHot
SpotÐéÄâ»úÖУ¬¿ÉÒÔʹÓÃ-Xss²ÎÊýÀ´ÉèÖÃÕ»µÄ´óС¡£Õ»µÄ´óСֱ½Ó¾ö¶¨Á˺¯Êýµ÷ÓõĿɴïÉî¶È¡£
3.¶Ñ Heap:
¶ÑÊÇJVMËù¹ÜÀíµÄÄÚ´æÖйú×î´óµÄÒ»¿é£¬ÊDZ»ËùÓÐJavaÏß³ÌËø¹²ÏíµÄ£¬²»ÊÇḬ̈߳²È«µÄ£¬ÔÚJVMÆô¶¯Ê±´´½¨¡£¶ÑÊÇ´æ´¢Java¶ÔÏóµÄµØ·½£¬ÕâÒ»µãJavaÐéÄâ»ú¹æ·¶ÖÐÃèÊöÊÇ£ºËùÓеĶÔÏóʵÀýÒÔ¼°Êý×é¶¼ÒªÔÚ¶ÑÉÏ·ÖÅä¡£Java¶ÑÊÇGC¹ÜÀíµÄÖ÷񻂿Óò£¬´ÓÄÚ´æ»ØÊյĽǶÈÀ´¿´£¬ÓÉÓÚÏÖÔÚGC»ù±¾¶¼²ÉÓ÷ִúÊÕ¼¯Ëã·¨£¬ËùÒÔJava¶Ñ»¹¿ÉÒÔϸ·ÖΪ£ºÐÂÉú´úºÍÀÏÄê´ú£»ÐÂÉú´úÔÙϸÖÂÒ»µãÓÐEden¿Õ¼ä¡¢From
Survivor¿Õ¼ä¡¢To Survivor¿Õ¼äµÈ¡£
4.·½·¨ÇøMethod Area:
·½·¨Çø´æ·ÅÁËÒª¼ÓÔØµÄÀàµÄÐÅÏ¢£¨Ãû³Æ¡¢ÐÞÊηûµÈ£©¡¢ÀàÖеľ²Ì¬³£Á¿¡¢ÀàÖж¨ÒåΪfinalÀàÐ͵ij£Á¿¡¢ÀàÖеÄFieldÐÅÏ¢¡¢ÀàÖеķ½·¨ÐÅÏ¢£¬µ±ÔÚ³ÌÐòÖÐͨ¹ýClass¶ÔÏóµÄgetName.isInterfaceµÈ·½·¨À´»ñÈ¡ÐÅϢʱ£¬ÕâЩÊý¾Ý¶¼À´Ô´ÓÚ·½·¨Çø¡£·½·¨ÇøÊDZ»JavaÏß³ÌËø¹²ÏíµÄ£¬²»ÏñJava¶ÑÖÐÆäËû²¿·ÖÒ»Ñù»áƵ·±±»GC»ØÊÕ£¬Ëü´æ´¢µÄÐÅÏ¢Ïà¶Ô±È½ÏÎȶ¨£¬ÔÚÒ»¶¨Ìõ¼þÏ»ᱻGC£¬µ±·½·¨ÇøÒªÊ¹ÓõÄÄڴ泬¹ýÆäÔÊÐíµÄ´óСʱ£¬»áÅ׳öOutOfMemoryµÄ´íÎóÐÅÏ¢¡£·½·¨ÇøÒ²ÊǶÑÖеÄÒ»²¿·Ö£¬¾ÍÊÇÎÒÃÇͨ³£Ëù˵µÄJava¶ÑÖеÄÓÀ¾ÃÇø
Permanet Generation£¬´óС¿ÉÒÔͨ¹ý²ÎÊýÀ´ÉèÖÃ,¿ÉÒÔͨ¹ý-XX:PermSizeÖ¸¶¨³õʼֵ£¬-XX:MaxPermSizeÖ¸¶¨×î´óÖµ¡£
5.³£Á¿³ØConstant Pool:
³£Á¿³Ø±¾ÉíÊÇ·½·¨ÇøÖеÄÒ»¸öÊý¾Ý½á¹¹¡£³£Á¿³ØÖд洢ÁËÈç×Ö·û´®¡¢final±äÁ¿Öµ¡¢ÀàÃûºÍ·½·¨Ãû³£Á¿¡£³£Á¿³ØÔÚ±àÒëÆÚ¼ä¾Í±»È·¶¨£¬²¢±£´æÔÚÒѱàÒëµÄ.classÎļþÖС£Ò»°ã·ÖΪÁ½Àࣺ×ÖÃæÁ¿ºÍÓ¦ÓÃÁ¿¡£×ÖÃæÁ¿¾ÍÊÇ×Ö·û´®¡¢final±äÁ¿µÈ¡£ÀàÃûºÍ·½·¨ÃûÊôÓÚÒýÓÃÁ¿¡£ÒýÓÃÁ¿×î³£¼ûµÄÊÇÔÚµ÷Ó÷½·¨µÄʱºò£¬¸ù¾Ý·½·¨ÃûÕÒµ½·½·¨µÄÒýÓ㬲¢ÒԴ˶¨Îªµ½º¯ÊýÌå½øÐк¯Êý´úÂëµÄÖ´ÐС£ÒýÓÃÁ¿°üº¬£ºÀàºÍ½Ó¿ÚµÄȨÏÞ¶¨Ãû¡¢×ֶεÄÃû³ÆºÍÃèÊö·û£¬·½·¨µÄÃû³ÆºÍÃèÊö·û¡£
6.±¾µØ·½·¨Õ»Native Method Stack:
±¾µØ·½·¨Õ»ºÍJavaÕ»Ëù·¢»ÓµÄ×÷Ó÷dz£ÏàËÆ£¬Çø±ð²»¹ýÊÇJavaջΪJVMÖ´ÐÐJava·½·¨·þÎñ£¬¶ø±¾µØ·½·¨Õ»ÎªJVMÖ´ÐÐNative·½·¨·þÎñ¡£±¾µØ·½·¨Õ»Ò²»áÅ׳öStackOverflowErrorºÍOutOfMemoryErrorÒì³£¡£
Ö÷ÄÚ´æºÍ¹¤×÷Äڴ棺
JavaÄÚ´æÄ£Ð͵ÄÖ÷ҪĿ±êÊǶ¨Òå³ÌÐòÖи÷¸ö±äÁ¿µÄ·ÃÎʹæÔò£¬¼´ÔÚJVMÖн«±äÁ¿´æ´¢µ½ÄÚ´æºÍ´ÓÄÚ´æÖÐÈ¡³ö±äÁ¿ÕâÑùµÄµ×²ãϸ½Ú¡£´Ë´¦µÄ±äÁ¿ÓëJava±à³ÌÀïÃæµÄ±äÁ¿ÓÐËù²»Í¬²½£¬Ëü°üº¬ÁËʵÀý×ֶΡ¢¾²Ì¬×ֶκ͹¹³ÉÊý×é¶ÔÏóµÄÔªËØ£¬µ«²»°üº¬¾Ö²¿±äÁ¿ºÍ·½·¨²ÎÊý£¬ÒòΪºóÕßÊÇÏß³Ì˽Óе쬲»»á¹²Ïí£¬µ±È»²»´æÔÚÊý¾Ý¾ºÕùÎÊÌ⣨Èç¹û¾Ö²¿±äÁ¿ÊÇÒ»¸öreferenceÒýÓÃÀàÐÍ£¬ËüÒýÓõĶÔÏóÔÚJava¶ÑÖпɱ»¸÷¸öÏ̹߳²Ïí£¬µ«ÊÇreferenceÒýÓñ¾ÉíÔÚJavaÕ»µÄ¾Ö²¿±äÁ¿±íÖУ¬ÊÇÏß³Ì˽Óеģ©¡£ÎªÁË»ñµÃ½Ï¸ßµÄÖ´ÐÐЧÄÜ£¬JavaÄÚ´æÄ£ÐͲ¢Ã»ÓÐÏÞÖÆÖ´ÐÐÒýÆðʹÓô¦ÀíÆ÷µÄÌØ¶¨¼Ä´æÆ÷»òÕß»º´æÀ´ºÍÖ÷ÄÚ´æ½øÐн»»¥£¬Ò²Ã»ÓÐÏÞÖÆ¼´Ê±±àÒëÆ÷½øÐе÷Õû´úÂëÖ´ÐÐ˳ÐòÕâÀàÓÅ»¯´ëÊ©¡£
JMM¹æ¶¨ÁËËùÓеıäÁ¿¶¼´æ´¢ÔÚÖ÷Äڴ棨Main Memory£©ÖС£Ã¿¸öÏ̻߳¹ÓÐ×Ô¼ºµÄ¹¤×÷Äڴ棨Working
Memory£©,Ï̵߳Ť×÷ÄÚ´æÖб£´æÁ˸ÃÏß³ÌʹÓõ½µÄ±äÁ¿µÄÖ÷ÄÚ´æµÄ¸±±¾¿½±´£¬Ï̶߳ԱäÁ¿µÄËùÓвÙ×÷£¨¶ÁÈ¡¡¢¸³ÖµµÈ£©¶¼±ØÐëÔÚ¹¤×÷ÄÚ´æÖнøÐУ¬¶ø²»ÄÜÖ±½Ó¶ÁдÖ÷ÄÚ´æÖеıäÁ¿£¨volatile±äÁ¿ÈÔÈ»Óй¤×÷ÄÚ´æµÄ¿½±´£¬µ«ÊÇÓÉÓÚËüÌØÊâµÄ²Ù×÷˳ÐòÐԹ涨£¬ËùÒÔ¿´ÆðÀ´Èçֱͬ½ÓÔÚÖ÷ÄÚ´æÖжÁд·ÃÎÊÒ»°ã£©¡£²»Í¬µÄÏß³ÌÖ®¼äÒ²ÎÞ·¨Ö±½Ó·ÃÎʶԷ½¹¤×÷ÄÚ´æÖеıäÁ¿£¬Ïß³ÌÖ®¼äÖµµÄ´«µÝ¶¼ÐèҪͨ¹ýÖ÷ÄÚ´æÀ´Íê³É¡£
Ïß³Ì1ºÍÏß³Ì2ÒªÏë½øÐÐÊý¾ÝµÄ½»»»Ò»°ãÒª¾ÀúÏÂÃæµÄ²½Ö裺
1.Ïß³Ì1°Ñ¹¤×÷ÄÚ´æ1ÖеĸüйýµÄ¹²Ïí±äÁ¿Ë¢Ðµ½Ö÷ÄÚ´æÖÐÈ¥¡£
2.Ïß³Ì2µ½Ö÷ÄÚ´æÖÐÈ¥¶ÁÈ¡Ïß³Ì1ˢйýµÄ¹²Ïí±äÁ¿£¬È»ºócopyÒ»·Ýµ½¹¤×÷ÄÚ´æ2ÖÐÈ¥¡£
JavaÄÚ´æÄ£ÐÍÊÇÎ§ÈÆ×Ų¢·¢±à³ÌÖÐÔ×ÓÐÔ¡¢¿É¼ûÐÔ¡¢ÓÐÐòÐÔÕâÈý¸öÌØÕ÷À´½¨Á¢µÄ£¬ÄÇÎÒÃÇÒÀ´Î¿´Ò»ÏÂÕâÈý¸öÌØÕ÷£º
Ô×ÓÐÔ£¨Atomicity£©£ºÒ»¸ö²Ù×÷²»Äܱ»´ò¶Ï£¬ÒªÃ´È«²¿Ö´ÐÐÍê±Ï£¬ÒªÃ´²»Ö´ÐС£ÔÚÕâµãÉÏÓеãÀàËÆÓÚÊÂÎñ²Ù×÷£¬ÒªÃ´È«²¿Ö´Ðгɹ¦£¬ÒªÃ´»ØÍ˵½Ö´ÐиòÙ×÷֮ǰµÄ״̬¡£
»ù±¾ÀàÐÍÊý¾ÝµÄ·ÃÎÊ´ó¶¼ÊÇÔ×Ó²Ù×÷£¬long ºÍdoubleÀàÐ͵ıäÁ¿ÊÇ64룬µ«ÊÇÔÚ32λJVMÖУ¬32λµÄJVM»á½«64λÊý¾ÝµÄ¶Áд²Ù×÷·ÖΪ2´Î32λµÄ¶Áд²Ù×÷À´½øÐУ¬Õâ¾Íµ¼ÖÂÁËlong¡¢doubleÀàÐ͵ıäÁ¿ÔÚ32λÐéÄâ»úÖÐÊÇ·ÇÔ×Ó²Ù×÷£¬Êý¾ÝÓпÉÄÜ»á±»ÆÆ»µ£¬Ò²¾ÍÒâζ×Ŷà¸öÏß³ÌÔÚ²¢·¢·ÃÎʵÄʱºòÊÇÏ̷߳ǰ²È«µÄ¡£
ÏÂÃæÎÒÃÇÀ´ÑÝʾÕâ¸ö32λJVMÏ£¬¶Ô64λlongÀàÐ͵ÄÊý¾ÝµÄ·ÃÎʵÄÎÊÌ⣺
public class
NotAtomicity {
//¾²Ì¬±äÁ¿t
public static long t = 0;
//¾²Ì¬±äÁ¿tµÄget·½·¨
public static long getT() {
return t;
}
//¾²Ì¬±äÁ¿tµÄset·½·¨
public static void setT(long t) {
NotAtomicity.t = t;
}
//¸Ä±ä±äÁ¿tµÄÏß³Ì
public static class ChangeT implements Runnable{
private long to;
public ChangeT(long to) {
this.to = to;
}
public void run() {
//²»¶ÏµÄ½«long±äÁ¿ÉèÖµµ½ tÖÐ
while (true) {
NotAtomicity.setT(to);
//½«µ±Ç°Ï̵߳ÄÖ´ÐÐʱ¼äƬ¶ÎÈóöÈ¥£¬ÒÔ±ãÓÉÏ̵߳÷¶È»úÖÆÖØÐ¾ö¶¨ÄĸöÏ߳̿ÉÒÔÖ´ÐÐ
Thread.yield();
}
}
}
//¶ÁÈ¡±äÁ¿tµÄỊ̈߳¬Èô¶ÁÈ¡µÄÖµºÍÉèÖõÄÖµ²»Ò»Ö£¬ËµÃ÷±äÁ¿tµÄÊý¾Ý±»ÆÆ»µÁË£¬¼´Ï̲߳»°²È«
public static class ReadT implements Runnable{
public void run() {
//²»¶ÏµÄ¶ÁÈ¡NotAtomicityµÄtµÄÖµ
while (true) {
long tmp = NotAtomicity.getT();
//±È½ÏÊÇ·ñÊÇ×Ô¼ºÉèÖµµÄÆäÖÐÒ»¸ö
if (tmp != 100L && tmp != 200L &&
tmp != -300L && tmp != -400L) {
//³ÌÐòÈôÖ´Ðе½ÕâÀ˵Ã÷longÀàÐͱäÁ¿t£¬ÆäÊý¾ÝÒѾ±»ÆÆ»µÁË
System.out.println(tmp);
}
////½«µ±Ç°Ï̵߳ÄÖ´ÐÐʱ¼äƬ¶ÎÈóöÈ¥£¬ÒÔ±ãÓÉÏ̵߳÷¶È»úÖÆÖØÐ¾ö¶¨ÄĸöÏ߳̿ÉÒÔÖ´ÐÐ
Thread.yield();
}
}
}
public static void main(String[] args) {
new Thread(new ChangeT(100L)).start();
new Thread(new ChangeT(200L)).start();
new Thread(new ChangeT(-300L)).start();
new Thread(new ChangeT(-400L)).start();
new Thread(new ReadT()).start();
}
} |
ÎÒÃÇ´´½¨ÁË4¸öÏß³ÌÀ´¶ÔlongÀàÐ͵ıäÁ¿t½øÐи³Öµ£¬¸³Öµ·Ö±ðΪ100,200£¬-300£¬-400£¬ÓÐÒ»¸öÏ̸߳ºÔð¶ÁÈ¡±äÁ¿t,Èç¹ûÕý³£µÄ»°£¬¶ÁÈ¡µ½µÄtµÄÖµÓ¦¸ÃÊÇÎÒÃǸ³ÖµÖеÄÒ»¸ö£¬µ«ÊÇÔÚ32µÄJVMÖУ¬ÊÂÇé»á³öºõÔ¤ÁÏ¡£Èç¹û³ÌÐòÕý³£µÄ»°£¬ÎÒÃÇ¿ØÖÆÌ¨²»»áÓÐÈκεÄÊä³ö£¬¿Éʵ¼ÊÉÏ£¬³ÌÐòÒ»ÔËÐУ¬¿ØÖÆÌ¨¾ÍÊä³öÁËÏÂÃæµÄÐÅÏ¢£º
-4294967096
4294966896
-4294967096
-4294967096
4294966896
Ö®ËùÒÔ»á³öÏÖÉÏÃæµÄÇé¿ö£¬ÊÇÒòΪÔÚ32λJVMÖУ¬64λµÄlongÊý¾ÝµÄ¶ÁºÍд¶¼²»ÊÇÔ×Ó²Ù×÷£¬¼´²»¾ßÓÐÔ×ÓÐÔ£¬²¢·¢µÄʱºòÏ໥¸ÉÈÅÁË¡£
32λµÄJVMÖУ¬ÒªÏë±£Ö¤¶Ôlong¡¢doubleÀàÐÍÊý¾ÝµÄ²Ù×÷µÄÔ×ÓÐÔ£¬¿ÉÒÔ¶Ô·ÃÎʸÃÊý¾ÝµÄ·½·¨½øÐÐͬ²½£¬¾ÍÏñÏÂÃæµÄ£º
public class
Atomicity {
//¾²Ì¬±äÁ¿t
public static long t = 0;
//¾²Ì¬±äÁ¿tµÄget·½·¨,ͬ²½·½·¨
public synchronized static long getT() {
return t;
}
//¾²Ì¬±äÁ¿tµÄset·½·¨£¬Í¬²½·½·¨
public synchronized static void setT(long t) {
Atomicity.t = t;
}
//¸Ä±ä±äÁ¿tµÄÏß³Ì
public static class ChangeT implements Runnable{
private long to;
public ChangeT(long to) {
this.to = to;
}
public void run() {
//²»¶ÏµÄ½«long±äÁ¿ÉèÖµµ½ tÖÐ
while (true) {
Atomicity.setT(to);
//½«µ±Ç°Ï̵߳ÄÖ´ÐÐʱ¼äƬ¶ÎÈóöÈ¥£¬ÒÔ±ãÓÉÏ̵߳÷¶È»úÖÆÖØÐ¾ö¶¨ÄĸöÏ߳̿ÉÒÔÖ´ÐÐ
Thread.yield();
}
}
}
//¶ÁÈ¡±äÁ¿tµÄỊ̈߳¬Èô¶ÁÈ¡µÄÖµºÍÉèÖõÄÖµ²»Ò»Ö£¬ËµÃ÷±äÁ¿tµÄÊý¾Ý±»ÆÆ»µÁË£¬¼´Ï̲߳»°²È«
public static class ReadT implements Runnable{
public void run() {
//²»¶ÏµÄ¶ÁÈ¡NotAtomicityµÄtµÄÖµ
while (true) {
long tmp = Atomicity.getT();
//±È½ÏÊÇ·ñÊÇ×Ô¼ºÉèÖµµÄÆäÖÐÒ»¸ö
if (tmp != 100L && tmp != 200L &&
tmp != -300L && tmp != -400L) {
//³ÌÐòÈôÖ´Ðе½ÕâÀ˵Ã÷longÀàÐͱäÁ¿t£¬ÆäÊý¾ÝÒѾ±»ÆÆ»µÁË
System.out.println(tmp);
}
////½«µ±Ç°Ï̵߳ÄÖ´ÐÐʱ¼äƬ¶ÎÈóöÈ¥£¬ÒÔ±ãÓÉÏ̵߳÷¶È»úÖÆÖØÐ¾ö¶¨ÄĸöÏ߳̿ÉÒÔÖ´ÐÐ
Thread.yield();
}
}
}
public static void main(String[] args) {
new Thread(new ChangeT(100L)).start();
new Thread(new ChangeT(200L)).start();
new Thread(new ChangeT(-300L)).start();
new Thread(new ChangeT(-400L)).start();
new Thread(new ReadT()).start();
}
|
ÕâÑù×öµÄ»°£¬¿ÉÒÔ±£Ö¤¶Ô64λÊý¾Ý²Ù×÷µÄÔ×ÓÐÔ¡£
¿É¼ûÐÔ£ºÒ»¸öÏ̶߳Թ²Ïí±äÁ¿×öÁËÐÞ¸ÄÖ®ºó£¬ÆäËûµÄÏß³ÌÁ¢¼´Äܹ»¿´µ½£¨¸ÐÖªµ½£©¸Ã±äÁ¿ÕâÖÖÐ޸썱仝£©¡£
JavaÄÚ´æÄ£ÐÍÊÇͨ¹ý½«ÔÚ¹¤×÷ÄÚ´æÖеıäÁ¿Ð޸ĺóµÄֵͬ²½µ½Ö÷Äڴ棬ÔÚ¶ÁÈ¡±äÁ¿Ç°´ÓÖ÷ÄÚ´æË¢ÐÂ×îÐÂÖµµ½¹¤×÷ÄÚ´æÖУ¬ÕâÖÖÒÀÀµÖ÷ÄÚ´æµÄ·½Ê½À´ÊµÏֿɼûÐԵġ£
ÎÞÂÛÊÇÆÕͨ±äÁ¿»¹ÊÇvolatile±äÁ¿¶¼ÊÇÈç´Ë£¬Çø±ðÔÚÓÚ£ºvolatileµÄÌØÊâ¹æÔò±£Ö¤ÁËvolatile±äÁ¿ÖµÐ޸ĺóµÄÐÂÖµÁ¢¿Ìͬ²½µ½Ö÷Äڴ棬ÿ´ÎʹÓÃvolatile±äÁ¿Ç°Á¢¼´´ÓÖ÷ÄÚ´æÖÐˢУ¬Òò´Ëvolatile±£Ö¤Á˶àÏß³ÌÖ®¼äµÄ²Ù×÷±äÁ¿µÄ¿É¼ûÐÔ£¬¶øÆÕͨ±äÁ¿Ôò²»Äܱ£Ö¤ÕâÒ»µã¡£
³ýÁËvolatile¹Ø¼ü×ÖÄÜʵÏֿɼûÐÔÖ®Í⣬»¹ÓÐsynchronized,Lock£¬finalÒ²ÊÇ¿ÉÒԵġ£
ʹÓÃsynchronized¹Ø¼ü×Ö£¬ÔÚͬ²½·½·¨/ͬ²½¿é¿ªÊ¼Ê±£¨Monitor Enter£©,ʹÓù²Ïí±äÁ¿Ê±»á´ÓÖ÷ÄÚ´æÖÐˢбäÁ¿Öµµ½¹¤×÷ÄÚ´æÖУ¨¼´´ÓÖ÷ÄÚ´æÖжÁÈ¡×îÐÂÖµµ½Ïß³Ì˽ÓеŤ×÷ÄÚ´æÖУ©£¬ÔÚͬ²½·½·¨/ͬ²½¿é½áÊøÊ±(Monitor
Exit),»á½«¹¤×÷ÄÚ´æÖеıäÁ¿ÖµÍ¬²½µ½Ö÷ÄÚ´æÖÐÈ¥£¨¼´½«Ïß³Ì˽ÓеŤ×÷ÄÚ´æÖеÄֵдÈëµ½Ö÷ÄÚ´æ½øÐÐͬ²½£©¡£
ʹÓÃLock½Ó¿ÚµÄ×î³£ÓõÄʵÏÖReentrantLock(ÖØÈëËø)À´ÊµÏֿɼûÐÔ£ºµ±ÎÒÃÇÔÚ·½·¨µÄ¿ªÊ¼Î»ÖÃÖ´ÐÐlock.lock()·½·¨£¬ÕâºÍsynchronized¿ªÊ¼Î»Öã¨Monitor
Enter£©ÓÐÏàͬµÄÓïÒ壬¼´Ê¹Óù²Ïí±äÁ¿Ê±»á´ÓÖ÷ÄÚ´æÖÐˢбäÁ¿Öµµ½¹¤×÷ÄÚ´æÖУ¨¼´´ÓÖ÷ÄÚ´æÖжÁÈ¡×îÐÂÖµµ½Ïß³Ì˽ÓеŤ×÷ÄÚ´æÖУ©£¬ÔÚ·½·¨µÄ×îºófinally¿éÀïÖ´ÐÐlock.unlock()·½·¨£¬ºÍsynchronized½áÊøÎ»Öã¨Monitor
Exit£©ÓÐÏàͬµÄÓïÒå,¼´»á½«¹¤×÷ÄÚ´æÖеıäÁ¿ÖµÍ¬²½µ½Ö÷ÄÚ´æÖÐÈ¥£¨¼´½«Ïß³Ì˽ÓеŤ×÷ÄÚ´æÖеÄֵдÈëµ½Ö÷ÄÚ´æ½øÐÐͬ²½£©¡£
final¹Ø¼ü×ֵĿɼûÐÔÊÇÖ¸£º±»finalÐÞÊεıäÁ¿£¬ÔÚ¹¹Ô캯ÊýÊýÒ»µ©³õʼ»¯Íê³É£¬²¢ÇÒÔÚ¹¹Ô캯ÊýÖв¢Ã»Óаѡ°this¡±µÄÒýÓô«µÝ³öÈ¥£¨¡°this¡±ÒýÓÃÌÓÒÝÊǺÜΣÏյ쬯äËûµÄÏ̺߳ܿÉÄÜͨ¹ý¸ÃÒýÓ÷ÃÎʵ½Ö»¡°³õʼ»¯Ò»°ë¡±µÄ¶ÔÏ󣩣¬ÄÇôÆäËûÏ߳̾ͿÉÒÔ¿´µ½final±äÁ¿µÄÖµ¡£
ÓÐÐòÐÔ£º¶ÔÓÚÒ»¸öÏ̵߳ĴúÂë¶øÑÔ£¬ÎÒÃÇ×ÜÊÇÒÔΪ´úÂëµÄÖ´ÐÐÊÇ´ÓǰÍùºóµÄ£¬ÒÀ´ÎÖ´Ðеġ£Õâô˵²»ÄÜ˵ÍêÈ«²»¶Ô£¬ÔÚµ¥Ï̳߳ÌÐòÀȷʵ»áÕâÑùÖ´ÐУ»µ«ÊÇÔÚ¶àÏ̲߳¢·¢Ê±£¬³ÌÐòµÄÖ´ÐоÍÓпÉÄܳöÏÖÂÒÐò¡£ÓÃÒ»¾ä»°¿ÉÒÔ×ܽáΪ£ºÔÚ±¾Ïß³ÌÄڹ۲죬²Ù×÷¶¼ÊÇÓÐÐòµÄ£»Èç¹ûÔÚÒ»¸öÏß³ÌÖй۲ìÁíÍâÒ»¸öỊ̈߳¬ËùÓеIJÙ×÷¶¼ÊÇÎÞÐòµÄ¡£Ç°°ë¾äÊÇÖ¸¡°Ïß³ÌÄÚ±íÏÖΪ´®ÐÐÓïÒ壨WithIn
Thread As-if-Serial Semantics£©¡±,ºó°ë¾äÊÇÖ¸¡°Ö¸ÁîÖØÅÅ¡±ÏÖÏóºÍ¡°¹¤×÷ÄÚ´æºÍÖ÷ÄÚ´æÍ¬²½ÑÓ³Ù¡±ÏÖÏó¡£
JavaÌṩÁËÁ½¸ö¹Ø¼ü×ÖvolatileºÍsynchronizedÀ´±£Ö¤¶àÏß³ÌÖ®¼ä²Ù×÷µÄÓÐÐòÐÔ,volatile¹Ø¼ü×Ö±¾Éíͨ¹ý¼ÓÈëÄÚ´æÆÁÕÏÀ´½ûÖ¹Ö¸ÁîµÄÖØÅÅÐò£¬¶øsynchronized¹Ø¼ü×Öͨ¹ýÒ»¸ö±äÁ¿ÔÚͬһʱ¼äÖ»ÔÊÐíÓÐÒ»¸öÏß³Ì¶ÔÆä½øÐмÓËøµÄ¹æÔòÀ´ÊµÏÖ£¬
ÔÚµ¥Ï̳߳ÌÐòÖУ¬²»»á·¢Éú¡°Ö¸ÁîÖØÅÅ¡±ºÍ¡°¹¤×÷ÄÚ´æºÍÖ÷ÄÚ´æÍ¬²½ÑÓ³Ù¡±ÏÖÏó£¬Ö»ÔÚ¶àÏ̳߳ÌÐòÖгöÏÖ¡£
happens-beforeÔÔò£º
JavaÄÚ´æÄ£ÐÍÖж¨ÒåµÄÁ½Ïî²Ù×÷Ö®¼äµÄ´ÎÐò¹ØÏµ£¬Èç¹û˵²Ù×÷AÏÈÐз¢ÉúÓÚ²Ù×÷B£¬²Ù×÷A²úÉúµÄÓ°ÏìÄܱ»²Ù×÷B¹Û²ìµ½£¬¡°Ó°Ï족°üº¬ÁËÐÞ¸ÄÁËÄÚ´æÖй²Ïí±äÁ¿µÄÖµ¡¢·¢ËÍÁËÏûÏ¢¡¢µ÷ÓÃÁË·½·¨µÈ¡£
ÏÂÃæÊÇJavaÄÚ´æÄ£ÐÍÏÂһЩ¡±ÌìÈ»µÄ¡°happens-before¹ØÏµ£¬ÕâЩhappens-before¹ØÏµÎÞÐëÈκÎͬ²½Æ÷ÐÖú¾ÍÒѾ´æÔÚ£¬¿ÉÒÔÔÚ±àÂëÖÐÖ±½ÓʹÓá£Èç¹ûÁ½¸ö²Ù×÷Ö®¼äµÄ¹ØÏµ²»ÔÚ´ËÁУ¬²¢ÇÒÎÞ·¨´ÓÏÂÁйæÔòÍÆµ¼³öÀ´µÄ»°£¬ËüÃǾÍûÓÐ˳ÐòÐÔ±£ÕÏ£¬ÐéÄâ»ú¿ÉÒÔ¶ÔËüÃǽøÐÐËæÒâµØÖØÅÅÐò¡£
a.³ÌÐò´ÎÐò¹æÔò(Pragram Order Rule)£ºÔÚÒ»¸öÏß³ÌÄÚ£¬°´ÕÕ³ÌÐò´úÂë˳Ðò£¬ÊéдÔÚÇ°ÃæµÄ²Ù×÷ÏÈÐз¢ÉúÓÚÊéдÔÚºóÃæµÄ²Ù×÷¡£×¼È·µØËµÓ¦¸ÃÊÇ¿ØÖÆÁ÷˳Ðò¶ø²»ÊdzÌÐò´úÂë˳Ðò£¬ÒòΪҪ¿¼ÂÇ·ÖÖ§¡¢Ñ»·½á¹¹¡£
b.¹Ü³ÌËø¶¨¹æÔò(Monitor Lock Rule)£ºÒ»¸öunlock²Ù×÷ÏÈÐз¢ÉúÓÚºóÃæ¶Ôͬһ¸öËøµÄlock²Ù×÷¡£ÕâÀï±ØÐëÇ¿µ÷µÄÊÇͬһ¸öËø£¬¶ø¡±ºóÃæ¡°ÊÇָʱ¼äÉϵÄÏȺó˳Ðò¡£
c.volatile±äÁ¿¹æÔò(Volatile Variable Rule)£º¶ÔÒ»¸övolatile±äÁ¿µÄд²Ù×÷ÏÈÐз¢ÉúÓÚºóÃæ¶ÔÕâ¸ö±äÁ¿µÄ¶ÁÈ¡²Ù×÷£¬ÕâÀïµÄ¡±ºóÃæ¡°Í¬Ñùָʱ¼äÉϵÄÏȺó˳Ðò¡£
d.Ïß³ÌÆô¶¯¹æÔò(Thread Start Rule)£ºThread¶ÔÏóµÄstart()·½·¨ÏÈÐз¢ÉúÓÚ´ËÏ̵߳Äÿһ¸ö¶¯×÷¡£
e.Ïß³ÌÖÕÓÚ¹æÔò(Thread Termination Rule)£ºÏß³ÌÖеÄËùÓвÙ×÷¶¼ÏÈÐз¢ÉúÓÚ¶Ô´ËÏ̵߳ÄÖÕÖ¹¼ì²â£¬ÎÒÃÇ¿ÉÒÔͨ¹ýThread.join()·½·¨½áÊø£¬Thread.isAlive()µÄ·µ»ØÖµµÈ×÷¶Î¼ì²âµ½Ïß³ÌÒѾÖÕÖ¹Ö´ÐС£
f.Ïß³ÌÖжϹæÔò(Thread Interruption Rule)£º¶ÔÏß³Ìinterrupt()·½·¨µÄµ÷ÓÃÏÈÐз¢ÉúÓÚ±»ÖжÏÏ̵߳ĴúÂë¼ì²âµ½ÖжÏʼþµÄ·¢Éú£¬¿ÉÒÔͨ¹ýThread.interrupted()·½·¨¼ì²âÊÇ·ñÓÐÖжϷ¢Éú¡£
g.¶ÔÏóÖÕ½á¹æÔò(Finalizer Rule)£ºÒ»¸ö¶ÔÏó³õʼ»¯Íê³É(¹¹Ôì·½·¨Ö´ÐÐÍê³É)ÏÈÐз¢ÉúÓÚËüµÄfinalize()·½·¨µÄ¿ªÊ¼¡£
g.´«µÝÐÔ(Transitivity)£ºÈç¹û²Ù×÷AÏÈÐз¢ÉúÓÚ²Ù×÷B£¬²Ù×÷BÏÈÐз¢ÉúÓÚ²Ù×÷C£¬ÄǾͿÉÒԵóö²Ù×÷AÏÈÐз¢ÉúÓÚ²Ù×÷CµÄ½áÂÛ¡£
Ò»¸ö²Ù×÷¡±Ê±¼äÉϵÄÏÈ·¢Éú¡°²»´ú±íÕâ¸ö²Ù×÷»áÊÇ¡±ÏÈÐз¢Éú¡°£¬ÄÇÈç¹ûÒ»¸ö²Ù×÷¡±ÏÈÐз¢Éú¡°ÊÇ·ñ¾ÍÄÜÍÆµ¼³öÕâ¸ö²Ù×÷±Ø¶¨ÊÇ¡±Ê±¼äÉϵÄÏÈ·¢Éú
¡°ÄØ£¿Ò²ÊDz»³ÉÁ¢µÄ£¬Ò»¸öµäÐ͵ÄÀý×Ó¾ÍÊÇÖ¸ÁîÖØÅÅÐò¡£ËùÒÔʱ¼äÉϵÄÏȺó˳ÐòÓëhappens-beforeÔÔòÖ®¼ä»ù±¾Ã»ÓÐʲô¹ØÏµ£¬ËùÒÔºâÁ¿²¢·¢°²È«ÎÊÌâÒ»ÇбØÐëÒÔhappens-before
ÔÔòΪ׼¡£
|