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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
JavaÏß³ÌʵÏÖÓ밲ȫ
 
  2318  次浏览      27
 2018-8-14
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚcnblogs£¬½éÉÜÁËÏ̵߳ÄÈýÖÖʵÏÖ·½Ê½£¬JavaÏ̵߳ÄʵÏÖÓëµ÷¶È,Ḭ̈߳²È«µÈ¡£

Ò»¡¢Ï̵߳ÄʵÏÖ

1¡¢Ï̵߳ÄÈýÖÖʵÏÖ·½Ê½¡¡¡¡

Ê×ÏȲ¢·¢²¢²»ÊÇÎÒÃÇͨ³£ÎÒÃÇÈÏΪµÄ±ØÐëÒÀ¿¿Ï̲߳ÅÄÜʵÏÖ£¬µ«ÊÇÔÚJavaÖв¢·¢µÄʵÏÖÊÇÀë²»¿ªÏ̵߳ģ¬Ï̵߳ÄÖ÷ҪʵÏÖÓÐÈýÖÖ·½Ê½£º

ʹÓÃÄÚºËỊ̈߳¨Kernel Thread£¬KLT£©ÊµÏÖ

ʹÓÃÓû§Ïß³ÌʵÏÖ

ʹÓÃÓû§Ï̼߳ÓÇáÁ¿¼¶½ø³Ì»ìºÏʵÏÖ

£¨1£©Ê¹ÓÃÄÚºËỊ̈߳¨Kernel Thread£¬KLT£©ÊµÏÖ£º

Ö±½ÓÓÉOS£¨²Ù×÷ϵͳ£©Äںˣ¨Kernel£©Ö§³ÖµÄỊ̈߳¬³ÌÐòÖÐÒ»°ã²»»áʹÓÃÄÚºËỊ̈߳¬¶øÊÇ»áʹÓÃÄÚºËÏ̵߳ĸ߼¶½Ó¿Ú£¬¼´ÇáÁ¿¼¶½ø³Ì£¨Light Weight Process£¬LWP£©£¬Ò²¾ÍÊÇͨ³£ÒâÒåÉϵÄÏ̡߳£

ÿ¸öÇáÁ¿¼¶Ïß³ÌÓëÄÚºËÏß³ÌÖ®¼ä1:1µÄ¹ØÏµ³ÆÖ®ÎªÒ»¶ÔÒ»µÄÏß³ÌÄ£ÐÍ¡£

Óŵ㣺ÿ¸öLWPÊÇÒ»¸ö¶ÀÁ¢µ÷¶Èµ¥Ôª£¬¼´Ê¹×èÈûÁË£¬Ò²²»»áÓ°ÏìÕû¸ö½ø³Ì¡£

ȱµã£ºÐèÒªÔÚUser ModeÓëKernel ModeÖÐÀ´»ØÇл»£¬ÏµÍ³µ÷Óôú¼Û±È½Ï¸ß£»ÓÉÓÚÄÚºËÏ̵߳ÄÖ§³Ö»áÏûºÄÒ»¶¨µÄÄÚºË×ÊÔ´£¬Òò´ËÒ»¸öϵͳ֧³ÖÇáÁ¿¼¶½ø³ÌµÄÊýÁ¿ÊÇÓÐÏ޵ġ£

£¨2£©Ê¹ÓÃÓû§Ïß³ÌʵÏÖ£º

¹ãÒåÉÏÀ´Ëµ£¬Ò»¸öÏß³ÌÖ»Òª²»ÊÇÄÚºËÏ߳̾ͿÉÒÔÈÏΪÊÇÓû§Ị̈߳¨User Thread£¬UT£©£¬µ«ÆäʵÏÖÈÔÈ»½¨Á¢ÔÚÄÚºËÖ®ÉÏ£»ÏÁÒåÉÏÀ´Ëµ£¬¾ÍÊÇUTÊÇÖ¸ÍêÈ«½¨Á¢ÔÚÓû§¿Õ¼äµÄÏ߳̿âÉÏ£¬KernelÍêÈ«²»Äܸе½Ï̵߳ÄʵÏÖ£¬Ï̵߳ÄËùÓвÙ×÷ÍêÈ«ÔÚUser ModeÖÐÍê³É£¬²»ÐèÒªÄں˰ïÖú£¨²¿·Ö¸ßÐÔÄÜÊý¾Ý¿âÖеĶàÏ߳̾ÍÊÇUTʵÏֵģ©

ȱµã£ºËùÓеÄÏ̶߳¼ÐèÒªÓû§³ÌÐò×Ô¼º´¦Àí£¬ÒÔÖÁÓÚ¡°×èÈûÈçºÎ½â¾ö¡±µÈÎÊÌâºÜÄѽâ¾ö£¬ÉõÖÁÎÞ·¨ÊµÏÖ¡£ËùÒÔÏÖÔÚJavaµÈÓïÑÔÖÐÒѾ­ÅׯúʹÓÃÓû§Ï̡߳£

Óŵ㣺²»ÐèÒªÄÚºËÖ§³Ö

£¨3£©Ê¹ÓÃÓû§Ï̼߳ÓÇáÁ¿¼¶½ø³Ì»ìºÏʵÏÖ£º

ÄÚºËÏß³ÌÓëÓû§Ïß³ÌÒ»ÆðʹÓõÄʵÏÖ·½Ê½£¬¶øOSÌṩ֧³ÖµÄÇáÁ¿¼¶½ø³ÌÔòÊÇ×÷ΪÓû§Ïß³ÌÓëÄÚºËÏß³ÌÖ®¼äµÄÇÅÁº¡£UTÓëLWPµÄÊýÁ¿±ÈÊDz»¶¨µÄ£¬ÊÇM:NµÄ¹ØÏµ£¨Ðí¶àUnixϵÁеÄOS¶¼ÌṩM:NµÄÏß³ÌÄ£ÐÍ£©

2¡¢JavaÏ̵߳ÄʵÏÖÓëµ÷¶È

£¨1£©JavaÏ̵߳ÄʵÏÖ£º

OSÖ§³ÖÔõÑùµÄÏß³ÌÄ£ÐÍ£¬¶¼ÊÇÓÉJVMµÄÏß³ÌÔõôӳÉä¾ö¶¨µÄ¡£

ÔÚSun JDKÖУ¬WindowsÓëLinux¶¼ÊÇʹÓÃÒ»¶ÔÒ»µÄÏß³ÌÄ£ÐÍʵÏÖ£¨Ò»ÌõJavaÏß³ÌÓ³Éäµ½Ò»ÌõÇáÁ¿¼¶½ø³ÌÖ®ÖУ©£»

ÔÚSolarisƽ̨ÖУ¬Í¬Ê±Ö§³ÖÒ»¶ÔÒ»Óë¶à¶Ô¶àµÄÏß³ÌÄ£ÐÍ

£¨2£©JavaÏ̵߳÷¶È£º

ÊÇָϵͳÄÚ²¿ÎªÏ̷߳ÖÅä´¦ÀíʹÓÃȨµÄ¹ý³Ì£¬Ö÷Òªµ÷¶È·ÖΪÁ½ÖÖ£¬·Ö±ðÊÇЭͬʽÏ̵߳÷¶ÈºÍÇÀռʽÏ̵߳÷¶È¡£

1£©Ð­Í¬Ê½µ÷¶È£ºÏß³ÌÖ´ÐÐʱ¼äÓÉÏ̱߳¾Éí¿ØÖÆ£¬Ï̹߳¤×÷½áÊøºóÖ÷¶¯Í¨ÖªÏµÍ³Çл»µ½ÁíÒ»¸öÏß³ÌÈ¥¡£¡¡¡¡¡¡¡¡

¢Ù ȱµã£ºÏß³ÌÖ´ÐÐʱ¼ä²»¿É¿Ø£¬Çл»Ê±¼ä²»¿ÉÔ¤Öª¡£Èç¹ûÒ»Ö±²»¸æËßϵͳÇл»Ị̈߳¬ÄÇô³ÌÐò¾ÍÒ»Ö±×èÈûÔÚÄÇÀï¡£

¢Ú Óŵ㣺ʵÏÖ¼òµ¥£¬ÓÉÓÚÊÇÏȰÑÏß³ÌÈÎÎñÍê³ÉÔÙÇл»£¬ËùÒÔÇл»²Ù×÷¶ÔÏß³Ì×Ô¼ºÊÇ¿ÉÖªµÄ¡£

2£©ÇÀռʽµ÷¶È£ºÏß³ÌÖ´ÐÐʱ¼äÓÉϵͳÀ´·ÖÅ䣬Çл»²»ÓÉÏ̱߳¾Éí¾ö¶¨£¬JavaʹÓþÍÊÇÇÀռʽµ÷¶È¡£²¢ÇÒ¿ÉÒÔ·ÖÅäÓÅÏȼ¶£¨JavaÏß³ÌÖÐÉèÖÃÁË10Öм¶±ð£©£¬µ«²¢²»ÊÇ¿¿Æ×µÄ£¨ÓÅÏȼ¶¿ÉÄÜ»áÔÚOSÖб»¸Ä±ä£©£¬ÕâÊÇÒòΪÏ̵߳÷¶È×îÖÕ±»Ó³Éäµ½OSÉÏ£¬ÓÉOS˵ÁËË㣬ËùÒÔ²»¼ûµÃÓëJavaÏ̵߳ÄÓÅÏȼ¶Ò»Ò»¶ÔÓ¦£¨ÊÂʵÉÏWindowsÓÐ7ÖУ¬SolairsÖÐÓÐ2µÄ31´Î·½£©

¶þ¡¢Ḭ̈߳²È«

1¡¢JavaÖÐÎåÖÖ¹²ÏíÊý¾Ý

£¨1£©²»¿É±ä£ºµäÐ͵ÄfinalÐÞÊÎÊDz»¿É±äµÄ£¨ÔÚ¹¹ÔìÆ÷½áÊøÖ®ºó£©£¬»¹ÓÐString¶ÔÏóÒÔ¼°Ã¶¾ÙÀàÐÍÕâЩ±¾Éí²»¿É±äµÄ¡£

£¨2£©¾ø¶ÔḬ̈߳²È«£º²»¹ÜÔËÐÐʱ»·¾³ÈçºÎ£¬µ÷ÓÃÕß¶¼²»ÐèÒªÈκζîÍâµÄͬ²½´ëÊ©£¨Í¨³£ÐèÒªºÜ´óÉõÖÁ²»ÇÐʵ¼ÊµÄ´ú¼Û£©£¬ÔÚJava APIÖкܶàḬ̈߳²È«µÄÀà´ó¶àÊý¶¼²»ÊǾø¶ÔḬ̈߳²È«£¬±ÈÈçjava.util.VectorÊÇÒ»¸öḬ̈߳²È«ÈÝÆ÷£¬ËüµÄºÜ¶à·½·¨£¨get()¡¢add()¡¢size()£©·½·¨¶¼ÊDZ»synchronizedÐÞÊΣ¬µ«ÊDz¢²»´ú±íµ÷ÓÃËüµÄʱºò¾Í²»ÐèҪͬ²½ÊÖ¶ÎÁË¡£

£¨3£©Ïà¶ÔḬ̈߳²È«£º¾ÍÊÇÎÒÃÇͨ³£ËµµÄḬ̈߳²È«£¬Java APIÖкܶàÕâÑùµÄÀý×Ó£¬±ÈÈçHashTable¡¢VectorµÈ¡£

£¨4£©Ï̼߳æÈÝ£º¾ÍÊÇÎÒÃÇͨ³£ËµµÄÏ̲߳»°²È«µÄ£¬ÐèÒª¶îÍâµÄͬ²½´ëÊ©²ÅÄܱ£Ö¤²¢·¢»·¾³Ï°²È«Ê¹Ó㬱ÈÈçArrayListºÍHashMap

£¨5£©Ï̶߳ÔÁ¢£º²»¹Ü²ÉÓúÎÖÖÊֶΣ¬¶¼ÎÞ·¨ÔÚ¶àÏ̻߳·¾³Öв¢·¢Ê¹Óá£

2¡¢Ḭ̈߳²È«µÄʵÏÖ·½·¨

£¨1£©»¥³âͬ²½£¨Mutual Exclision & Synchronization£©

ͬ²½£º±£Ö¤Í¬Ò»Ê±¿Ì¹²ÏíÊý¾Ý±»Ò»¸öỊ̈߳¨ÔÚʹÓÃÐźÅÁ¿µÄʱºòÒ²¿ÉÒÔÊÇһЩỊ̈߳©Ê¹Óá£

»¥³â£º»¥³âÊÇʵÏÖͬ²½µÄÒ»ÖÖÊֶΣ¬ÁÙ½çÇø¡¢»¥³âÁ¿ºÍÐźÅÁ¿¶¼ÊÇÖ÷ÒªµÄ»¥³âÊֶΡ£

1£©JavaÖÐ×î³£ÓõĻ¥³âͬ²½ÊֶξÍÊÇsynchronized¹Ø¼ü×Ö£¬synchronized¹Ø¼ü×Ö¾­¹ý±àÒëºó»áÔÚ´úÂë¿éǰºóÉú³Émonitorenter£¨Ëø¼ÆÊýÆ÷¼Ó1£©Óëmonitorexit£¨Ëø¼ÆÊýÆ÷¼õ1£©×Ö½ÚÂëÖ¸Á¶øÕâÁ½¸öÖ¸ÁîÐèÒªÒ»¸öÒýÓÃÀàÐͲÎÊýÖ¸Ã÷ÒªËø¶¨ºÍ½âËøµÄ¶ÔÏó£¬Ò²¾ÍÊÇsynchronized(object/Object.class)´«ÈëµÄ¶ÔÏó²ÎÊý£¬Èç¹ûûÓвÎÊýÖ¸¶¨£¬ÄǾͿ´synchronizedÐÞÊεÄÊÇʵÀý·½·¨»¹ÊÇÀà·½·¨£¬È¥È¡¶ÔÓ¦µÄ¶ÔÏóʵÀýÓëClass¶ÔÏó×÷ÎªËø¶ÔÏó¡£

JavaÏß³ÌÒªÓ³Éäµ½OSÔ­ÉúÏß³ÌÉÏ£¬Ò²¾ÍÊÇÐèÒª´ÓÓû§Ì¬×ªÎªºËÐÄ£¨ÏµÍ³£©Ì¬£¬Õâ¸öת»»¿ÉÄÜÏûºÄµÄʱ¼ä»áºÜ³¤£¬¾¡¹ÜVM¶Ôsynchronized×öÁËһЩÓÅ»¯£¬µ«»¹ÊÇÒ»ÖÖÖØÁ¿¼¶µÄ²Ù×÷¡£

2£©ÁíÒ»¸ö¾ÍÊÇjava.util.concurrent°üϵÄÖØÈëËø£¨ReentrantLock£©£¬ÓësynchronizedÏàËÆ£¬¶¼¾ßÓÐÏß³ÌÖØÈ루ºóÃæ»á½éÉÜÖØÈë¸ÅÄî£©ÌØÐÔ£¬µ«ÊÇReentrantLockÓÐÈý¸öÖ÷ÒªµÄ²»Í¬ÓÚsynchronizedµÄ¹¦ÄÜ£º

µÈ´ý¿ÉÖжϣº³ÖÓÐËø³¤Ê±¼ä²»ÊÍ·Å£¬µÈ´ýµÄÏ߳̿ÉÒÔÑ¡ÔñÏÈ·ÅÆúµÈ´ý£¬¸Ä×öÆäËûÊÂÇé¡£

¿ÉʵÏÖ¹«Æ½Ëø£º¶à¸öÏ̵߳ȴýͬһ¸öËøÊ±£¬Êǰ´ÕÕʱ¼äÏȺó˳ÐòÒÀ´Î»ñµÃËø£¬Ïà·´·Ç¹«Æ½ËøÈκÎÒ»¸öÏ̶߳¼Óлú»á»ñµÃËø¡£

Ëø°ó¶¨¶à¸öÌõ¼þ£ºÊÇÖ¸ReentrantLock¶ÔÏó¿ÉÒÔͬʱ°ó¶¨¶à¸öCondition¶ÔÏó¡£

JDK 1.6Ö®ºósynchronizedÓëReentrantLockÐÔÄÜÉÏ»ù±¾³Öƽ£¬µ«ÊÇVMÔÚδÀ´¸Ä½øÖиüÇãÏòÓÚsynchronized£¬ËùÒÔÔڴ󲿷ÖÇé¿öÏÂÓÅÏÈ¿¼ÂÇsynchronized¡£

£¨2£©·Ç×èÈûͬ²½

1)¡°±¯¹Û¡±²¢·¢²ßÂÔ------·Ç×èÈûͬ²½¸ÅÄî

»¥³âͬ²½Ö÷ÒªÎÊÌâ»òÕß˵ÊÇÓ°ÏìÐÔÄܵÄÎÊÌâÊÇÏß³Ì×èÈûÓ뻽ÐÑÎÊÌ⣬ËüÊÇÒ»ÖÖ¡°±¯¹Û¡±²¢·¢²ßÂÔ£º×ÜÊÇ»áÈÏΪ×Ô¼º²»È¥×öÏàÓ¦µÄͬ²½´ëÊ©£¬ÎÞÂÛ¹²ÏíÊý¾ÝÊÇ·ñ´æÔÚ¾ºÕùËü¶¼»áÈ¥¼ÓËø¡£

¶øÏà·´ÓÐÒ»ÖÖ¡°ÀÖ¹Û¡±²¢·¢²ßÂÔ£¬Ò²¾ÍÊÇÏȲÙ×÷£¬Èç¹ûûÓÐÆäËûÏß³ÌʹÓù²ÏíÊý¾Ý£¬ÄDzÙ×÷¾ÍËãÊdzɹ¦ÁË£¬µ«ÊÇÈç¹û¹²ÏíÊý¾Ý±»Ê¹Óã¬ÄÇô¾Í»áÒ»Ö±²»¶Ï³¢ÊÔ£¬Ö±µ½»ñµÃËøÊ¹Óõ½¹²ÏíÊý¾ÝΪֹ£¨ÕâÊÇ×î³£ÓõIJßÂÔ£©£¬ÕâÑùµÄ»°¾ÍÏ߳̾͸ù±¾²»ÐèÒª¹ÒÆð¡£Õâ¾ÍÊÇ·Ç×èÈûͬ²½£¨Non-Blocking Synchronization£©

ʹÓá°ÀÖ¹Û¡±²¢·¢²ßÂÔÐèÒª²Ù×÷ºÍ³åÍ»¼ì²âÁ½¸ö²½Öè¾ßÓÐÔ­×ÓÐÔ£¬¶øÕâ¸öÔ­×ÓÐÔÖ»ÄÜ¿¿Ó²¼þÍê³É£¬±£Ö¤Ò»¸ö´ÓÓïÒåÉÏ¿´ÆðÀ´ÐèÒª¶à´Î²Ù×÷µÄÐÐΪֻͨ¹ýÒ»Ìõ´¦ÀíÆ÷Ö¸Áî¾ÍÄÜÍê³É¡£³£ÓõÄÖ¸ÁîÓУº²âÊÔ²¢ÉèÖã¨Test-and-Set£©¡¢»ñÈ¡²¢Ôö¼Ó£¨Fetch-and-Increment£©¡¢½»»»£¨Swap£©¡¢±È½Ï²¢½»»»£¨Compare-and-Swap£¬CAS£©¡¢¼ÓÔØÁ´½Ó/Ìõ¼þ´¢´æ£¨Load-Linked/Store-Conditional£¬LL/SC£©

2£©CAS½éÉÜ

ÓÐÈý¸ö²Ù×÷Êý£¬·Ö±ðÊÇÄÚ´æÎ»ÖÃV£¬¾ÉµÄÔ¤ÆÚÖµAºÍÐÂÖµB£¬CASÖ¸ÁîÖ´ÐÐʱ£¬µ±ÇÒ½öµ±V·ûºÏ¾ÉÔ¤ÆÚÖµAʱ£¬´¦ÀíÆ÷ÓÃÐÂÖµB¸üÐÂVµÄÖµ£¬·ñÔò²»¸üУ¬µ«ÊǶ¼»á·µ»ØVµÄ¾ÉÖµ£¬Õû¸ö¹ý³Ì¶¼ÊÇÒ»¸öÔ­×Ó¹ý³Ì¡£

֮ǰÎÒÔÚJavaÄÚ´æÄ£ÐͲ©ÎÄÖнéÉÜvolatile¹Ø¼ü×ÖµÄÔڸ߲¢·¢Ï²¢·Ç°²È«µÄÀý×ÓÖУ¬×îºóµÄ½á¹û²¢²»ÊÇÎÒÃÇÏëÒªµÄ½á¹û£¬µ«ÊÇÔÚjava.util.concurrentÕûÊýÔ­×ÓÀà( ÈçAtomicInteger)ÖУ¬compareAndSet()ÓëgetAndIncrement()·½·¨Ê¹ÓÃÁËUnsafeÀàµÄCAS²Ù×÷¡£ÏÖÔÚÎÒÃǽ«int»»³ÉAtomicInteger£¬½á¹û¶¼ÊÇÎÒÃÇËùÆÚ´ýµÄ10000

package cas;
/**
* Atomic ±äÁ¿×ÔÔöÔËËã²âÊÔ
* @author Lijian
*
*/
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class CASDemo {
private static final int THREAD_NUM = 10;//Ïß³ÌÊýÄ¿
private static final long AWAIT_TIME = 5*1000;//µÈ´ýʱ¼ä
public static AtomicInteger race = new AtomicInteger(0);
public static void increase() { race.incrementAndGet(); }
public static void main(String[] args) throws Inter ruptedException {
ExecutorService exe = Executors .newFixedThreadPool ( THREAD _ NUM);
for (int i = 0; i < THREAD_NUM; i++) {
exe.execute (new Runnable() {
@Override
public void run() {
for (int j = 0; j < 1000; j++) {
increase();
}
}
});
}
//¼ì²âExecutorService Ï̳߳ØÈÎÎñ½áÊø²¢ÇÒÊÇ·ñ¹Ø±Õ£ºÒ»°ã½áºÏshutdown ÓëawaitTermination ¹²Í¬Ê¹ÓÃ
//shutdown Í£Ö¹½ÓÊÕеÄÈÎÎñ²¢ÇҵȴýÒѾ­Ìá½»µÄÈÎÎñ
exe . shutdown();
//awaitTerminationµÈ´ý³¬Ê±ÉèÖã¬¼à¿ØExecutorService ÊÇ·ñ¹Ø±Õ
while (!exe.awaitTermination (AWAIT_ TIME, TimeUnit . SECONDS )) {
System.out.println ("Ï̳߳ØÃ»ÓйرÕ");
}
System.out.println(race);
}
}

ͨ¹ý¹Û²ìincrementAndGet()·½·¨Ô´ÂëÎÒÃÇ·¢ÏÖ£º

public final int getAndIncrement() {
for(;;){
int current = get();
int next = current+1;
if(compareAndSet(current, next)) {
return current;
}
}
}

ͨ¹ýfor(;;)Ñ­»·²»¶Ï³¢ÊÔ½«µ±Ç°current¼Ó1ºóµÄÐÂÖµ£¨mext£©¸³Öµ£¨compareAndSet£©¸ø×Ô¼º£¬Èç¹ûʧ°ÜµÄ»°¾ÍÖØÐÂÑ­»·³¢ÊÔ£¬Öµµ½³É¹¦ÎªÖ¹·µ»ØcurrentÖµ¡£¡¡¡¡

3£©CASµÄABAÎÊÌâ

ÕâÊÇCASµÄÒ»¸öÂß¼­Â©¶´£¬±ÈÈçVÖµÔÚµÚÒ»´Î¶ÁÈ¡µÄʱºòÊÇAÖµ£¬¼´Ã»Óб»¸Ä±ä¹ý£¬ÕâʱºòÕýҪ׼±¸¸³Öµ£¬µ«ÊÇAµÄÖµÕæÃ»Óб»¸Ä±ä¹ýÂð£¿

´ð°¸ÊDz»Ò»¶¨µÄ£¬ÒòΪÔÚ¼ì²âAÖµÕâ¸ö¹ý³ÌÖÐAµÄÖµ¿ÉÄܱ»¸ÄΪB×îºóÓָĻØA£¬¶øCAS»úÖÆ¾ÍÈÏΪËüûÓб»¸Ä±ä¹ý£¬ÕâÒ²¾ÍÊÇABAÎÊÌ⣬½â¾öÕâ¸öÎÊÌâ¾ÍÊÇÔö¼Ó°æ±¾¿ØÖƱäÁ¿£¬µ«ÊǴ󲿷ÖÇé¿öÏÂABAÎÊÌâ²»»áÓ°Ïì³ÌÐò²¢·¢µÄÕýÈ·ÐÔ¡£

£¨3£©ÎÞͬ²½·½°¸

¡°Òª±£ÕÏḬ̈߳²È«£¬±ØÐë²ÉÓÃÏàÓ¦µÄͬ²½´ëÊ©¡±Õâ¾ä»°Êµ¼ÊÉÏÊDz»³ÉÁ¢µÄ£¬ÒòΪÓÐЩ±¾Éí¾ÍÊÇḬ̈߳²È«µÄ£¬Ëü¿ÉÄܲ»Éæ¼°¹²ÏíÊý¾Ý×ÔÈ»¾Í²»ÐèÒªÈκÎͬ²½´ëÊ©±£Ö¤ÕýÈ·ÐÔ¡£Ö÷ÒªÓÐÁ½Àࣺ

1£©¿ÉÖØÈë´úÂ루Reentrant Code£©

Ò²¾ÍÊǾ­³£Ëù˵µÄ´¿´úÂ루Pure Code£©£¬¿ÉÒÔÔÚÈκÎʱ¿ÌÖжÏËü£¬Ö®ºóתÈëÆäËûµÄ³ÌÐò£¨µ±È»Ò²°üÀ¨×ÔÉíµÄrecursion£©¡£×îºó·µ»Øµ½Ô­³ÌÐòÖжø²»»á·¢ÉúÈκεĴíÎ󣬼´ËùÓпÉÖØÈëµÄ´úÂë¶¼ÊÇḬ̈߳²È«µÄ£¬¶øËùÓÐḬ̈߳²È«µÄ´úÂë¶¼ÊÇ¿ÉÖØÈëµÄ

ÆäÖ÷ÒªÌØÕ÷ÊÇÒÔϼ¸µã£º

¢Ù ²»ÒÀÀµ´æ´¢ÔÚ¶Ñ£¨¶ÑÖжÔÏóÊǹ²ÏíµÄ£©ÉϵÄÊý¾ÝºÍ¹«ÓõÄϵͳ×ÊÔ´£¨·½·¨ÇøÖпÉÒÔ¹²ÏíµÄÊý¾Ý¡£±ÈÈ磺staticÐÞÊεıäÁ¿£¬ÀàµÄ¿ÉÒÔÏà¹Ø¹²ÏíµÄÊý¾Ý£©£¬¿ÉÒÔ»»¾ä»°Ëµ¾ÍÊDz»º¬ÓÐÈ«¾Ö±äÁ¿µÈ£»

¢Ú Óõ½µÄ״̬ÓɲÎÊýÐÎʽ´«È룻

¢Û ²»µ÷ÓÃÈκηǿÉÖØÈëµÄ·½·¨¡£

¼´¿ÉÒÔÒÔÕâÑùµÄÔ­ÔòÀ´ÅжϣºÎÒÃÇÈç¹ûÄÜÔ¤²âÒ»¸ö·½·¨µÄ·µ»Ø½á¹û²¢ÇÒ·½·¨±¾ÉíÊÇ¿ÉÔ¤²âµÄ£¬ÄÇôÊäÈëÏàͬµÄÊý¾Ý£¬¶¼»áµÃµ½ÏàÓ¦ÎÒÃÇËùÆÚ´ýµÄ½á¹û£¬¾ÍÂú×ãÁË¿ÉÖØÈëÐÔµÄÒªÇó¡£

2£©Ï̱߳¾µØ´æ´¢£¨Thread Lock Storage£©

Èç¹ûÒ»¶Î´úÂëÖÐËùÐèÒªµÄÊý¾Ý±ØÐëÓëÆäËû´úÂë¹²Ïí£¬ÄÇôÄܱ£Ö¤½«ÕâЩ¹²ÏíÊý¾Ý·Åµ½Í¬Ò»¸ö¿É¼ûÏß³ÌÄÚ£¬ÄÇôÎÞÐëͬ²½Ò²Äܱ£Ö¤Ïß³ÌÖ®¼ä²»´æÔÚ¾ºÕù¹ØÏµ¡£

ÔÚJavaÖÐÈç¹ûÒ»¸ö±äÁ¿Òª±»¶àÏ̷߳ÃÎÊ£¬¿ÉÒÔʹÓÃvolatile¹Ø¼ü×ÖÐÞÊα£Ö¤¿É¼ûÐÔ£¬Èç¹ûÒ»¸ö±äÁ¿Òª±»Ä³¸öÏ̹߳²Ïí£¬¿ÉÒÔͨ¹ýjava.lang.ThreadLocalÀàʵÏÖ±¾µØ´æ´¢µÄ¹¦ÄÜ¡£Ã¿¸öÏß³ÌThread¶ÔÏó¶¼ÓÐÒ»¸öThreadLocalMap£¨key-value, ThreadLocalHashCode-LocalValue£©£¬ThreadLocal¾ÍÊǵ±Ç°Ïß³ÌThreadLocalMapµÄÈë¿Ú¡£

×¢£ºÕâÀïÖ»ÊǼòµ¥Á˽â¸ÅÄʵ¼ÊÉÏThreadLocal²¿·ÖµÄ֪ʶÓÈÎªÖØÒª£¡Ö®ºó»á³éʱ¼äϸϸÑо¿¡£

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

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

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

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