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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Java²¢·¢±à³Ì£ºÐÔÄÜ¡¢À©Õ¹ÐÔºÍÏìÓ¦
 
À´Ô´£ºÂëÅ©Íø ·¢²¼ÓÚ 2017-4-1
  4080  次浏览      31
 

1¡¢½éÉÜ

±¾ÎÄÌÖÂÛµÄÖØµãÔÚÓÚ¶àÏß³ÌÓ¦ÓóÌÐòµÄÐÔÄÜÎÊÌâ¡£ÎÒÃÇ»áÏȸøÐÔÄܺÍÀ©Õ¹ÐÔÏÂÒ»¸ö¶¨Ò壬ȻºóÔÙ×ÐϸѧϰһÏÂAmdahl·¨Ôò¡£ÏÂÃæµÄÄÚÈÝÎÒÃǻῼ²ìÒ»ÏÂÈçºÎÓò»Í¬µÄ¼¼Êõ·½·¨À´¼õÉÙËø¾ºÕù£¬ÒÔ¼°ÈçºÎÓôúÂëÀ´ÊµÏÖ¡£

2¡¢ÐÔÄÜ

ÎÒÃǶ¼ÖªµÀ£¬¶àÏ߳̿ÉÒÔÓÃÀ´Ìá¸ß³ÌÐòµÄÐÔÄÜ£¬±³ºóµÄÔ­ÒòÔÚÓÚÎÒÃÇÓжàºËµÄCPU»ò¶à¸öCPU¡£Ã¿¸öCPUµÄÄں˶¼¿ÉÒÔ×Ô¼ºÍê³ÉÈÎÎñ£¬Òò´Ë°ÑÒ»¸ö´óµÄÈÎÎñ·Ö½â³ÉһϵÁеĿɱ˴˶ÀÁ¢ÔËÐеÄСÈÎÎñ¾Í¿ÉÒÔÌá¸ß³ÌÐòµÄÕûÌåÐÔÄÜÁË¡£¿ÉÒÔ¾Ù¸öÀý×Ó£¬±ÈÈçÓиö³ÌÐòÓÃÀ´½«Ó²ÅÌÉÏij¸öÎļþ¼ÐϵÄËùÓÐͼƬµÄ³ß´ç½øÐÐÐ޸ģ¬Ó¦ÓöàÏ̼߳¼Êõ¾Í¿ÉÒÔÌá¸ßËüµÄÐÔÄÜ¡£Ê¹Óõ¥Ï̵߳ķ½Ê½Ö»ÄÜÒÀ´Î±éÀúËùÓÐͼƬÎļþ²¢ÇÒÖ´ÐÐÐ޸ģ¬Èç¹ûÎÒÃǵÄCPUÓжà¸öºËÐĵϰ£¬ºÁÎÞÒÉÎÊ£¬ËüÖ»ÄÜÀûÓÃÆäÖеÄÒ»¸öºË¡£Ê¹ÓöàÏ̵߳ķ½Ê½µÄ»°£¬ÎÒÃÇ¿ÉÒÔÈÃÒ»¸öÉú²úÕßÏß³ÌɨÃèÎļþϵͳ°Ñÿ¸öͼƬ¶¼Ìí¼Óµ½Ò»¸ö¶ÓÁÐÖУ¬È»ºóÓöà¸ö¹¤×÷Ïß³ÌÀ´Ö´ÐÐÕâЩÈÎÎñ¡£Èç¹ûÎÒÃǵŤ×÷Ï̵߳ÄÊýÁ¿ºÍCPU×ܵĺËÐÄÊýÒ»ÑùµÄ»°£¬ÎÒÃǾÍÄܱ£Ö¤Ã¿¸öCPUºËÐͼÓлî¿É¸É£¬Ö±µ½ÈÎÎñ±»È«²¿Ö´ÐÐÍê³É¡£

¶ÔÓÚÁíÍâÒ»ÖÖÐèÒª½Ï¶àIOµÈ´ýµÄ³ÌÐòÀ´Ëµ£¬ÀûÓöàÏ̼߳¼ÊõÒ²ÄÜÌá¸ßÕûÌåÐÔÄÜ¡£¼ÙÉèÎÒÃÇҪдÕâÑùÒ»¸ö³ÌÐò£¬ÐèҪץȡij¸öÍøÕ¾µÄËùÓÐHTMLÎļþ£¬²¢ÇÒ½«ËüÃÇ´æ´¢µ½±¾µØ´ÅÅÌÉÏ¡£³ÌÐò¿ÉÒÔ´Óijһ¸öÍøÒ³¿ªÊ¼£¬È»ºó½âÎöÕâ¸öÍøÒ³ÖÐËùÓÐÖ¸Ïò±¾ÍøÕ¾µÄÁ´½Ó£¬È»ºóÒÀ´ÎץȡÕâЩÁ´½Ó£¬ÕâÑùÖܶø¸´Ê¼¡£ÒòΪ´ÓÎÒÃǶÔÔ¶³ÌÍøÕ¾·¢ÆðÇëÇóµ½½ÓÊÕµ½ËùÓеÄÍøÒ³Êý¾ÝÐèÒªµÈ´ýÒ»¶Îʱ¼ä£¬ËùÒÔÎÒÃÇ¿ÉÒÔ½«´ËÈÎÎñ½»¸ø¶à¸öÏß³ÌÀ´Ö´ÐС£ÈÃÒ»¸ö»òÉÔ΢¸ü¶àÒ»µãµÄÏß³ÌÀ´½âÎöÒѾ­ÊÕµ½µÄHTMLÍøÒ³ÒÔ¼°½«ÕÒµ½µÄÁ´½Ó·ÅÈë¶ÓÁÐÖУ¬ÈÃÆäËûËùÓеÄÏ̸߳ºÔðÇëÇó»ñÈ¡Ò³Ãæ¡£ÓëÉÏÒ»¸öÀý×Ó²»Í¬µÄÊÇ£¬ÔÚÕâ¸öÀý×ÓÖУ¬Äã¼´±ãʹÓöàÓÚCPUºËÐÄÊýÁ¿µÄÏß³ÌÒ²ÈÔÈ»Äܹ»»ñµÃÐÔÄÜÌáÉý¡£

ÉÏÃæÕâÁ½¸öÀý×Ó¸æËßÎÒÃÇ£¬¸ßÐÔÄܾÍÊÇÔڶ̵Äʱ¼ä´°¿ÚÄÚ×ö¾¡Á¿¶àµÄÊÂÇé¡£Õâ¸öµ±È»ÊǶÔÐÔÄÜÒ»´ÊµÄ×î¾­µä½âÊÍÁË¡£µ«ÊÇͬʱ£¬Ê¹ÓÃÏß³ÌÒ²ÄܺܺõØÌáÉýÎÒÃdzÌÐòµÄÏìÓ¦ËÙ¶È¡£ÏëÏóÎÒÃÇÓÐÕâÑùÒ»¸öͼÐνçÃæµÄÓ¦ÓóÌÐò£¬ÉÏ·½ÓÐÒ»¸öÊäÈë¿ò£¬ÊäÈë¿òÏÂÃæÓÐÒ»¸öÃû×ֽС°´¦Àí¡±µÄ°´Å¥¡£µ±Óû§°´ÏÂÕâ¸ö°´Å¥µÄʱºò£¬Ó¦ÓóÌÐòÐèÒªÖØÐ¶԰´Å¥µÄ״̬½øÐÐäÖȾ£¨°´Å¥¿´ÆðÀ´±»°´ÏÂÁË£¬µ±ËÉ¿ªÊó±ê×ó¼üʱÓÖ»Ö¸´Ô­×´£©£¬²¢ÇÒ¿ªÊ¼¶ÔÓû§µÄÊäÈë½øÐд¦Àí¡£Èç¹û´¦ÀíÓû§ÊäÈëµÄÕâ¸öÈÎÎñ±È½ÏºÄʱµÄ»°£¬µ¥Ï̵߳ijÌÐò¾ÍÎÞ·¨¼ÌÐøÏìÓ¦Óû§ÆäËûµÄÊäÈ붯×÷ÁË£¬±ÈÈ磬À´×Ô²Ù×÷ϵͳ´«Ë͹ýÀ´µÄÓû§µ¥»÷Êó±êʼþ»òÊó±êÖ¸ÕëÒÆ¶¯Ê¼þµÈµÈ£¬ÕâЩʼþµÄÏìÓ¦ÐèÒªÓжÀÁ¢µÄÏß³ÌÀ´ÏìÓ¦¡£

¿ÉÀ©Õ¹ÐÔ£¨Scalability£©µÄÒâ˼ÊdzÌÐò¾ß±¸ÕâÑùµÄÄÜÁ¦£ºÍ¨¹ýÌí¼Ó¼ÆËã×ÊÔ´¾Í¿ÉÒÔ»ñµÃ¸ü¸ßµÄÐÔÄÜ¡£ÏëÏóÎÒÃÇÐèÒªµ÷ÕûºÜ¶àͼƬµÄ´óС£¬ÒòΪÎÒÃÇ»úÆ÷µÄCPUºËÐÄÊýÊÇÓÐÏ޵ģ¬ËùÒÔÔö¼ÓÏß³ÌÊýÁ¿²¢²»×ÜÄÜÏàÓ¦Ìá¸ßÐÔÄÜ¡£Ïà·´£¬ÒòΪµ÷¶ÈÆ÷ÐèÒª¸ºÔð¸ü¶àÏ̵߳Ĵ´½¨ºÍ¹Ø±Õ£¬Ò²»áÕ¼ÓÃCPU×ÊÔ´£¬·´¶øÓпÉÄܽµµÍÐÔÄÜ¡£

2.1 Amdahl·¨Ôò

ÉÏÒ»¶ÎÌáµ½ÁËÔÚijЩÇéÐÎÏ£¬Ìí¼Ó¶îÍâµÄÔËËã×ÊÔ´¿ÉÒÔÌá¸ß³ÌÐòµÄÕûÌåÐÔÄÜ¡£ÎªÁËÄܹ»¼ÆËã³öµ±ÎÒÃÇÌí¼ÓÁ˶îÍâµÄ×ÊÔ´µÄʱºòµ½µ×ÄÜ»ñµÃ¶àÉÙÐÔÄÜÌáÉý£¬ÎÒÃÇÓбØÒªÀ´¼ì²éһϳÌÐòÓÐÄÄЩ²¿·ÖÊÇ´®ÐÐÔËÐУ¨»òͬ²½ÔËÐУ©£¬ÓÐÄÄЩ²¿·ÖÊDz¢ÐÐÔËÐеġ£Èç¹ûÎÒÃǰÑÐèҪͬ²½Ö´ÐеĴúÂëÕ¼±ÈÁ¿»¯ÎªB£¨ÀýÈ磬ÐèҪͬ²½Ö´ÐеĴúÂëµÄÐÐÊý£©£¬°ÑCPUµÄ×ܺËÐÄÊý¼ÇΪn£¬ÄÇô£¬¸ù¾ÝAmdahl·¨Ôò£¬ÎÒÃÇ¿ÉÒÔ»ñµÃµÄÐÔÄÜÌáÉýµÄÉÏÏÞÊÇ£º

Èç¹ûnÇ÷ÓÚÎÞÇî´óµÄ»°£¬(1-B)/n¾ÍÊÕÁ²ÓÚ0¡£Òò´Ë£¬ÎÒÃÇ¿ÉÒÔºöÂÔÕâ¸ö±í´ïʽµÄÖµ£¬Òò´ËÐÔÄÜÌáÉýλÊýÊÕÁ²ÓÚ1/B£¬ÕâÀïÃæµÄB´ú±íÊÇÄÇЩ±ØÐëͬ²½ÔËÐеĴúÂë±ÈÀý¡£Èç¹ûBµÈÓÚ0.5µÄ»°£¬ÄÇÒâζ×ųÌÐòµÄÒ»°ë´úÂëÎÞ·¨²¢ÐÐÔËÐУ¬0.5µÄµ¹ÊýÊÇ2£¬Òò´Ë£¬¼´Ê¹ÎÒÃÇÌí¼ÓÎÞÊý¸öCPUºËÐÄ£¬ÎÒÃÇ»ñµÃµÄÐÔÄÜÌáÉýÒ²×î¶àÊÇ2±¶¡£¼ÙÉèÎÒÃÇÏÖÔڰѳÌÐòÐÞ¸ÄÁËһϣ¬ÐÞ¸ÄÖ®ºóÖ»ÓÐ0.25µÄ´úÂë±ØÐëͬ²½ÔËÐУ¬ÏÖÔÚ1/0.25=4£¬±íʾÎÒÃǵijÌÐòÈç¹ûÔÚ¾ßÓдóÁ¿CPUµÄÓ²¼þÉÏÔËÐÐʱËٶȽ«»á±ÈÔÚµ¥ºËµÄÓ²¼þÉÏ¿ì´ó¸Å4±¶¡£

ÁíÒ»·½Ã棬ͨ¹ýAmdahl·¨Ôò£¬ÎÒÃÇÒ²Äܸù¾ÝÎÒÃÇÏë»ñµÃµÄÌáËÙµÄÄ¿±ê¼ÆËã³ö³ÌÐòÓ¦¸ÃµÄͬ²½´úÂëµÄ±ÈÀý¡£Èç¹ûÎÒÃÇÏëÒª´ïµ½100±¶µÄÌáËÙ£¬¶ø1/100=0.01£¬Òâζ×Å£¬ÎÒÃdzÌÐòͬ²½Ö´ÐеĴúÂëµÄÊýÁ¿×î¶à²»Äܳ¬¹ý1%¡£

×ܽáAmdahl·¨ÔòÎÒÃÇ¿ÉÒÔ¿´³ö£¬ÎÒÃÇͨ¹ýÌí¼Ó¶îÍâCPUÀ´»ñµÃÐÔÄÜÌáÉýµÄ×î´óֵȡ¾öÓÚ³ÌÐòͬ²½Ö´Ðв¿·Ö´úÂëËùÕ¼µÄ±ÈÀýÓжàС¡£ËäÈ»ÔÚʵ¼ÊÖУ¬ÏëÒª¼ÆËã³öÕâ¸ö±ÈÀý²¢²»×ÜÊÇÄÇôÈÝÒ×£¬¸ü±ðËµÃæ¶ÔһЩ´óÐ͵ÄÉÌҵϵͳӦÓÃÁË£¬µ«ÊÇAmdahl·¨Ôò¸øÁËÎÒÃǺÜÖØÒªµÄÆôʾ£¬ÄǾÍÊÇ£¬ÎÒÃDZØÐë·Ç³£×ÐϸµØÈ¥¿¼ÂÇÄÇЩ±ØÐëͬ²½Ö´ÐеĴúÂ룬²¢ÇÒÁ¦Í¼¼õÉÙÕⲿ·Ö´úÂë¡£

2.2 ¶ÔÐÔÄܵÄÓ°Ïì

ÎÄÕÂдµ½ÕâÀÎÒÃÇÒѾ­±íÃ÷ÕâÑùÒ»¸ö¹Ûµã£ºÔö¼Ó¸ü¶àµÄÏ߳̿ÉÒÔÌá¸ß³ÌÐòµÄÐÔÄܺÍÏìÓ¦ËÙ¶È¡£µ«ÊÇÁíÒ»·½Ã棬ÏëҪȡµÃÕâЩºÃ´¦È´²¢·ÇÇá¶øÒ×¾Ù£¬Ò²ÐèÒª¸¶³öһЩ´ú¼Û¡£Ï̵߳ÄʹÓöÔÐÔÄܵÄÌáÉýÒ²»áÓÐËùÓ°Ïì¡£

Ê×ÏÈ£¬µÚÒ»¸öÓ°ÏìÀ´×ÔÏ̴߳´½¨µÄʱºò¡£Ï̵߳Ĵ´½¨¹ý³ÌÖУ¬JVMÐèÒª´Óµ×²ã²Ù×÷ϵͳÉêÇëÏàÓ¦µÄ×ÊÔ´£¬²¢ÇÒÔÚµ÷¶ÈÆ÷Öгõʼ»¯Êý¾Ý½á¹¹£¬ÒÔ±ã¾ö¶¨Ö´ÐÐÏ̵߳Ä˳Ðò¡£

Èç¹ûÄãµÄÏ̵߳ÄÊýÁ¿ºÍCPUµÄºËÐÄÊýÁ¿Ò»ÑùµÄ»°£¬Ã¿¸öÏ̶߳¼»áÔËÐÐÔÚÒ»¸öºËÐÄÉÏ£¬ÕâÑù»òÐíËûÃǾͲ»»á¾­³£±»´ò¶ÏÁË¡£µ«ÊÇÊÂʵÉÏ£¬ÔÚÄãµÄ³ÌÐòÔËÐеÄʱºò£¬²Ù×÷ϵͳҲ»áÓÐЩ×Ô¼ºµÄÔËËãÐèÒªCPUÈ¥´¦Àí¡£ËùÒÔ£¬¼´Ê¹ÕâÖÖÇéÐÎÏ£¬ÄãµÄÏß³ÌÒ²»á±»´ò¶Ï²¢Çҵȴý²Ù×÷ϵͳÀ´ÖØÐ»ָ´ËüµÄÔËÐС£µ±ÄãµÄÏß³ÌÊýÁ¿³¬¹ýCPUµÄºËÐÄÊýÁ¿µÄʱºò£¬Çé¿öÓпÉÄܱäµÃ¸ü»µ¡£ÔÚÕâÖÖÇé¿öÏ£¬JVMµÄ½ø³Ìµ÷¶ÈÆ÷»á´ò¶ÏijЩÏß³ÌÒÔ±ãÈÃÆäËûÏß³ÌÖ´ÐУ¬Ïß³ÌÇл»µÄʱºò£¬¸Õ²ÅÕýÔÚÔËÐеÄÏ̵߳ĵ±Ç°×´Ì¬ÐèÒª±»±£´æÏÂÀ´£¬ÒÔ±ãµÈÏ´ÎÔËÐеÄʱºò¿ÉÒÔ»Ö¸´Êý¾Ý״̬¡£²»½öÈç´Ë£¬µ÷¶ÈÆ÷Ò²»á¶ÔËü×Ô¼ºÄÚ²¿µÄÊý¾Ý½á¹¹½øÐиüУ¬¶øÕâÒ²ÐèÒªÏûºÄCPUÖÜÆÚ¡£ËùÓÐÕâЩ¶¼Òâζ×Å£¬Ïß³ÌÖ®¼äµÄÉÏÏÂÎÄÇл»»áÏûºÄCPU¼ÆËã×ÊÔ´£¬Òò´Ë´øÀ´Ïà±Èµ¥Ïß³ÌÇé¿öÏÂûÓеÄÐÔÄÜ¿ªÏú¡£

¶àÏ̳߳ÌÐòËù´øÀ´µÄÁíÍâÒ»¸ö¿ªÏúÀ´×Ô¶Ô¹²ÏíÊý¾ÝµÄͬ²½·ÃÎʱ£»¤¡£ÎÒÃÇ¿ÉÒÔʹÓÃsynchronized¹Ø¼ü×ÖÀ´½øÐÐͬ²½±£»¤£¬Ò²¿ÉÒÔʹÓÃVolatile¹Ø¼ü×ÖÀ´ÔÚ¶à¸öÏß³ÌÖ®¼ä¹²ÏíÊý¾Ý¡£Èç¹û¶àÓÚÒ»¸öÏß³ÌÏëҪȥ·ÃÎÊijһ¸ö¹²ÏíÊý¾Ý½á¹¹µÄ»°£¬¾Í·¢ÉúÁËÕùÓõÄÇéÐΣ¬Õâʱ£¬JVMÐèÒª¾ö¶¨Äĸö½ø³ÌÏÈ£¬Äĸö½ø³Ìºó¡£Èç¹û¾ö¶¨¸ÃÒªÖ´ÐеÄÏ̲߳»Êǵ±Ç°ÕýÔÚÔËÐеÄỊ̈߳¬ÄÇô¾Í»á·¢ÉúÏß³ÌÇл»¡£µ±Ç°Ïß³ÌÐèÒªµÈ´ý£¬Ö±µ½Ëü³É¹¦»ñµÃÁËËø¶ÔÏó¡£JVM¿ÉÒÔ×Ô¼º¾ö¶¨ÈçºÎÀ´Ö´ÐÐÕâÖÖ¡°µÈ´ý¡±£¬¼ÙÈçJVMÔ¤¼ÆÀë³É¹¦»ñµÃËø¶ÔÏóµÄʱ¼ä±È½Ï¶Ì£¬ÄÇJVM¿ÉÒÔʹÓü¤½øµÈ´ý·½·¨£¬±ÈÈ磬²»Í£µØ³¢ÊÔ»ñµÃËø¶ÔÏó£¬Ö±µ½³É¹¦£¬ÔÚÕâÖÖÇé¿öÏÂÕâÖÖ·½Ê½¿ÉÄÜ»á¸ü¸ßЧ£¬ÒòΪ±È½Ï½ø³ÌÉÏÏÂÎÄÇл»À´Ëµ£¬»¹ÊÇÕâÖÖ·½Ê½¸ü¿ìËÙһЩ¡£°ÑÒ»¸öµÈ´ý״̬µÄÏß³ÌŲ»Øµ½Ö´ÐжÓÁÐÒ²»á´øÀ´¶îÍâµÄ¿ªÏú¡£

Òò´Ë£¬ÎÒÃÇÒª¾¡Á¦±ÜÃâÓÉÓÚËø¾ºÕù¶ø´øÀ´µÄÉÏÏÂÎÄÇл»¡£ÏÂÃæÒ»½Ú½«²ûÊöÁ½ÖÖ½µµÍÕâÖÖ¾ºÕù·¢ÉúµÄ·½·¨¡£

2.3 Ëø¾ºÕù

ÏñÉÏÒ»½ÚËù˵µÄÄÇÑù£¬Á½¸ö»ò¸ü¶àÏ̶߳ÔËøµÄ¾ºÕù·ÃÎÊ»á´øÀ´¶îÍâµÄÔËË㿪Ïú£¬ÒòΪ¾ºÕùµÄ·¢Éú±ÆÆÈµ÷¶ÈÆ÷À´ÈÃÒ»¸öÏ߳̽øÈ뼤½øµÈ´ý״̬£¬»òÕßÈÃËü½øÐеȴý״̬¶øÒý·¢Á½´ÎÉÏÏÂÎÄÇл»¡£ÓÐijЩÇé¿öÏ£¬Ëø¾ºÕùµÄ¶ñ¹û¿ÉÒÔͨ¹ýÒÔÏ·½·¨À´¼õÇ᣺

1£¬¼õÉÙËøµÄ×÷ÓÃÓò£»

2£¬¼õÉÙÐèÒª»ñÈ¡ËøµÄƵÂÊ£»

3£¬¾¡Á¿Ê¹ÓÃÓÉÓ²¼þÖ§³ÖµÄÀÖ¹ÛËø²Ù×÷£¬¶ø²»ÊÇsynchronized£»

4£¬¾¡Á¿ÉÙÓÃsynchronized£»

5£¬¼õÉÙʹÓöÔÏ󻺴æ

2.3.1 Ëõ¼õͬ²½Óò

Èç¹û´úÂë³ÖÓÐËø³¬¹ý±ØÒªµÄʱ¼ä£¬ÄÇô¿ÉÒÔÓ¦ÓÃÕâµÚÒ»ÖÖ·½·¨¡£Í¨³£ÎÒÃÇ¿ÉÒÔ½«Ò»Ðлò¶àÐдúÂëÒÆ³öͬ²½ÇøÓòÀ´½µµÍµ±Ç°Ï̳߳ÖÓÐËøµÄʱ¼ä¡£ÔÚͬ²½ÇøÓòÀïÔËÐеĴúÂëÊýÁ¿Ô½ÉÙ£¬µ±Ç°Ï߳̾ͻáÔ½ÔçµØÊÍ·ÅËø£¬´Ó¶øÈÃÆäËûÏ̸߳üÔçµØ»ñµÃËø¡£ÕâÓëAmdahl·¨ÔòÏàÒ»Öµģ¬ÒòΪÕâÑù×ö¼õÉÙÁËÐèҪͬ²½Ö´ÐеĴúÂëÁ¿¡£

ΪÁ˸üºÃµØÀí½â£¬¿´ÏÂÃæµÄÔ´Â룺

public class ReduceLockDuration implements Runnable {

private static final int NUMBER_OF_THREADS = 5;

private static final Map<String, Integer> map = new HashMap<String, Integer>()

public void run() {

for (int i = 0; i < 10000; i++) {

synchronized (map) {

UUID randomUUID = UUID.randomUUID();

Integer value = Integer.valueOf(42);

String key = randomUUID.toString();

map.put(key, value);

}

Thread.yield();

}

}

public static void main(String[] args) throws InterruptedException {

Thread[] threads = new Thread[NUMBER_OF_THREADS];

for (int i = 0; i < NUMBER_OF_THREADS; i++) {

threads[i] = new Thread(new ReduceLockDuration());

}

long startMillis = System.currentTimeMillis();

for (int i = 0; i < NUMBER_OF_THREADS; i++) {

threads[i].start();

}

for (int i = 0; i < NUMBER_OF_THREADS; i++) {

threads[i].join();

}

System.out.println((System.currentTimeMillis()-startMillis)+"ms");

}

}

 
 

ÔÚÉÏÃæµÄÀý×ÓÖУ¬ÎÒÃÇÈÃÎå¸öÏß³ÌÀ´¾ºÕù·ÃÎʹ²ÏíµÄMapʵÀý£¬ÎªÁËÔÚͬһʱ¿ÌÖ»ÓÐÒ»¸öÏ߳̿ÉÒÔ·ÃÎʵ½MapʵÀý£¬ÎÒÃǽ«ÏòMapÖÐÌí¼ÓKey/ValueµÄ²Ù×÷·Åµ½ÁËsynchronized±£»¤µÄ´úÂë¿éÖС£µ±ÎÒÃÇ×Ðϸ²ì¿´Õâ¶Î´úÂëµÄʱºò£¬ÎÒÃÇ¿ÉÒÔ¿´µ½£¬¼ÆËãkeyºÍvalueµÄ¼¸¾ä´úÂë²¢²»ÐèҪͬ²½Ö´ÐУ¬keyºÍvalueÖ»ÊôÓÚµ±Ç°Ö´ÐÐÕâ¶Î´úÂëµÄỊ̈߳¬½ö½ö¶Ôµ±Ç°Ïß³ÌÓÐÒâÒ壬²¢ÇÒ²»»á±»ÆäËûÏß³ÌËùÐ޸ġ£Òò´Ë£¬ÎÒÃÇ¿ÉÒÔ°ÑÕ⼸¾äÒÆ³öͬ²½±£»¤¡£ÈçÏ£º

public void run() {

for (int i = 0; i < 10000; i++) {

UUID randomUUID = UUID.randomUUID();

Integer value = Integer.valueOf(42);

String key = randomUUID.toString();

synchronized (map) {

map.put(key, value);

}

Thread.yield();

}

}

 

½µµÍͬ²½´úÂëËù´øÀ´µÄЧ¹ûÊÇ¿ÉÒÔ²âÁ¿µÄ¡£ÔÚÎҵĻúÆ÷ÉÏ£¬Õû¸ö³ÌÐòµÄÖ´ÐÐʱ¼ä´Ó420ms½µµÍµ½ÁË370ms¡£¿´¿´°É£¬½ö½ö°ÑÈýÐдúÂëÒÆ³öͬ²½±£»¤¿é¾Í¿ÉÒÔ½«³ÌÐòÔËÐÐʱ¼ä¼õÉÙ11%¡£Thread.yield()Õâ¾ä´úÂëÊÇΪÁËÓÕ·¢Ïß³ÌÉÏÏÂÎÄÇл»µÄ£¬ÒòΪÕâ¾ä´úÂë»á¸æËßJVMµ±Ç°Ïß³ÌÏëÒª½»³öµ±Ç°Ê¹ÓõļÆËã×ÊÔ´£¬ÒÔ±ãÈÃÆäËûµÈ´ýÔËÐеÄÏß³ÌÔËÐС£ÕâÑùÒ²»á´øÀ´¸ü¶àµÄËø¾ºÕùµÄ·¢Éú£¬ÒòΪ£¬Èç¹û²»Èç´ËµÄ»°Ä³Ò»¸öÏ߳̾ͻá¸ü¾ÃµØÕ¼ÓÃij¸öºËÐļ̶ø¼õÉÙÁËÏß³ÌÉÏÏÂÎÄÇл»¡£

2.3.2 ·Ö²ðËø

ÁíÍâÒ»ÖÖ¼õÉÙËø¾ºÕùµÄ·½·¨Êǽ«Ò»¿é±»Ëø¶¨±£»¤µÄ´úÂë·ÖÉ¢µ½¶à¸ö¸üСµÄ±£»¤¿éÖС£Èç¹ûÄãµÄ³ÌÐòÖÐʹÓÃÁËÒ»¸öËøÀ´±£»¤¶à¸ö²»Í¬¶ÔÏóµÄ»°£¬ÕâÖÖ·½Ê½»áÓÐÓÃÎäÖ®µØ¡£¼ÙÉèÎÒÃÇÏëҪͨ¹ý³ÌÐòÀ´Í³¼ÆÒ»Ð©Êý¾Ý£¬²¢ÇÒʵÏÖÁËÒ»¸ö¼òµ¥µÄ¼ÆÊýÀàÀ´³ÖÓжà¸ö²»Í¬µÄͳ¼ÆÖ¸±ê£¬²¢ÇÒ·Ö±ðÓÃÒ»¸ö»ù±¾¼ÆÊý±äÁ¿À´±íʾ£¨longÀàÐÍ£©¡£ÒòΪÎÒÃǵijÌÐòÊǶàÏ̵߳ģ¬ËùÒÔÎÒÃÇÐèÒª¶Ô·ÃÎÊÕâЩ±äÁ¿µÄ²Ù×÷½øÐÐͬ²½±£»¤£¬ÒòΪÕâЩ²Ù×÷¶¯×÷À´×Ô²»Í¬µÄÏ̡߳£Òª´ïµ½Õâ¸öÄ¿µÄ£¬×î¼òµ¥µÄ·½Ê½¾ÍÊǶÔÿ¸ö·ÃÎÊÁËÕâЩ±äÁ¿µÄº¯ÊýÌí¼Ósynchronized¹Ø¼ü×Ö¡£

public static class CounterOneLock implements Counter {

private long customerCount = 0;

private long shippingCount = 0;

public synchronized void incrementCustomer() {

customerCount++;

}

public synchronized void incrementShipping() {

shippingCount++;

}

public synchronized long getCustomerCount() {

return customerCount;

}

public synchronized long getShippingCount() {

return shippingCount;

}

}

 
								
 

ÕâÖÖ·½Ê½Ò²¾ÍÒâζ×Å£¬¶ÔÕâЩ±äÁ¿µÄÿ´ÎÐ޸ͼ»áÒý·¢¶ÔÆäËûCounterʵÀýµÄËø¶¨¡£ÆäËûÏß³ÌÈç¹ûÏëÒª¶ÔÁíÍâÒ»¸ö²»Í¬µÄ±äÁ¿µ÷ÓÃincrement·½·¨£¬ÄÇÒ²Ö»Äܵȴýǰһ¸öÏß³ÌÊÍ·ÅÁËËø¿ØÖÆÖ®ºó²ÅÄÜÓлú»áÈ¥Íê³É¡£ÔÚ´ËÖÖÇé¿öÏ£¬¶Ôÿ¸ö²»Í¬µÄ±äÁ¿Ê¹Óõ¥¶ÀµÄsynchronized±£»¤½«»áÌá¸ßÖ´ÐÐЧÂÊ¡£

public static class CounterSeparateLock implements Counter {

private static final Object customerLock = new Object();

private static final Object shippingLock = new Object();

private long customerCount = 0;

private long shippingCount = 0;

public void incrementCustomer() {

synchronized (customerLock) {

customerCount++;

}

}

public void incrementShipping() {

synchronized (shippingLock) {

shippingCount++;

}

}

public long getCustomerCount() {

synchronized (customerLock) {

return customerCount;

}

}

public long getShippingCount() {

synchronized (shippingLock) {

return shippingCount;

}

}

}

 

ÕâÖÖʵÏÖΪÿ¸ö¼ÆÊýÖ¸±êÒýÈëÁËÒ»¸öµ¥¶Àsynchronized¶ÔÏó£¬Òò´Ë£¬Ò»¸öÏß³ÌÏëÒªÔö¼ÓCustomer¼ÆÊýµÄʱºò£¬Ëü±ØÐëµÈ´ýÁíÒ»¸öÕýÔÚÔö¼ÓCustomer¼ÆÊýµÄÏß³ÌÍê³É£¬¶ø²¢²»ÓõȴýÁíÒ»¸öÕýÔÚÔö¼ÓShipping¼ÆÊýµÄÏß³ÌÍê³É¡£

ʹÓÃÏÂÃæµÄÀ࣬ÎÒÃÇ¿ÉÒԷdz£ÈÝÒ׵ؼÆËã·Ö²ðËøËù´øÀ´µÄÐÔÄÜÌáÉý¡£

public class LockSplitting implements Runnable {

private static final int NUMBER_OF_THREADS = 5;

private Counter counter;

public interface Counter {

void incrementCustomer();

void incrementShipping();

long getCustomerCount();

long getShippingCount();

}

public static class CounterOneLock implements Counter { ... }

public static class CounterSeparateLock implements Counter { ... }

public LockSplitting(Counter counter) {

this.counter = counter;

}

public void run() {

for (int i = 0; i < 100000; i++) {

if (ThreadLocalRandom.current().nextBoolean()) {

counter.incrementCustomer();

} else {

counter.incrementShipping();

}

}

}

public static void main(String[] args) throws InterruptedException {

Thread[] threads = new Thread[NUMBER_OF_THREADS];

Counter counter = new CounterOneLock();

for (int i = 0; i < NUMBER_OF_THREADS; i++) {

threads[i] = new Thread(new LockSplitting(counter));

}

long startMillis = System.currentTimeMillis();

for (int i = 0; i < NUMBER_OF_THREADS; i++) {

threads[i].start();

}

for (int i = 0; i < NUMBER_OF_THREADS; i++) {

threads[i].join();

}

System.out.println((System.currentTimeMillis() - startMillis) + "ms");

}

}

 

ÔÚÎҵĻúÆ÷ÉÏ£¬µ¥Ò»ËøµÄʵÏÖ·½·¨Æ½¾ù»¨·Ñ56ms£¬Á½¸öµ¥¶ÀËøµÄʵÏÖÊÇ38ms¡£ºÄʱ´óÔ¼½µµÍÁË´ó¸Å32%¡£

ÁíÍâÒ»ÖÖÌáÉý·½Ê½ÊÇ£¬ÎÒÃÇÉõÖÁ¿ÉÒÔ¸ü½øÒ»²½µØ½«¶Áд·Ö¿ªÓò»Í¬µÄËøÀ´±£»¤¡£Ô­À´µÄCounterÀàÌṩÁ˶ԼÆÊýÖ¸±ê·Ö±ðÌṩÁ˶ÁºÍдµÄ·½·¨£¬µ«ÊÇÊÂʵÉÏ£¬¶Á²Ù×÷²¢²»ÐèҪͬ²½±£»¤£¬ÎÒÃÇ¿ÉÒÔ·ÅÐÄÈöà¸öÏ̲߳¢ÐжÁÈ¡µ±Ç°Ö¸±êµÄÊýÖµ£¬Í¬Ê±£¬Ð´²Ù×÷±ØÐëµÃµ½Í¬²½±£»¤¡£java.util.concurrent°üÀïÌṩÁËÓжÔReadWriteLock½Ó¿ÚµÄʵÏÖ£¬¿ÉÒÔ·½±ãµØÊµÏÖÕâÖÖÇø·Ö¡£

ReentrantReadWriteLockʵÏÖά»¤ÁËÁ½¸ö²»Í¬µÄËø£¬Ò»¸ö±£»¤¶Á²Ù×÷£¬Ò»¸ö±£»¤Ð´²Ù×÷¡£ÕâÁ½¸öËø¶¼ÓлñÈ¡ËøºÍÊÍ·ÅËøµÄ²Ù×÷¡£½ö½öµ±ÔÚûÓÐÈË»ñÈ¡¶ÁËøµÄʱºò£¬Ð´Ëø²ÅÄܳɹ¦»ñµÃ¡£·´¹ýÀ´£¬Ö»ÒªÐ´ËøÃ»Óб»»ñÈ¡£¬¶ÁËø¿ÉÒÔ±»¶à¸öÏß³Ìͬʱ»ñÈ¡¡£ÎªÁËÑÝʾÕâÖÖ·½·¨£¬ÏÂÃæµÄCounterÀàʹÓÃÁËReadWriteLock£¬ÈçÏ£º

public static class CounterReadWriteLock implements Counter {

private final ReentrantReadWriteLock customerLock = new ReentrantReadWriteLock();

private final Lock customerWriteLock = customerLock.writeLock();

private final Lock customerReadLock = customerLock.readLock();

private final ReentrantReadWriteLock shippingLock = new ReentrantReadWriteLock();

private final Lock shippingWriteLock = shippingLock.writeLock();

private final Lock shippingReadLock = shippingLock.readLock();

private long customerCount = 0;

private long shippingCount = 0;

public void incrementCustomer() {

customerWriteLock.lock();

customerCount++;

customerWriteLock.unlock();

}

public void incrementShipping() {

shippingWriteLock.lock();

shippingCount++;

shippingWriteLock.unlock();

}

public long getCustomerCount() {

customerReadLock.lock();

long count = customerCount;

customerReadLock.unlock();

return count;

}

public long getShippingCount() {

shippingReadLock.lock();

long count = shippingCount;

shippingReadLock.unlock();

return count;

}

}

 

ËùÓеĶÁ²Ù×÷¶¼±»¶ÁËø±£»¤£¬Í¬Ê±£¬ËùÓеÄд²Ù×÷¶¼±»Ð´ËøËù±£»¤¡£Èç¹û³ÌÐòÖÐÖ´ÐеĶÁ²Ù×÷ÒªÔ¶´óÓÚд²Ù×÷µÄ»°£¬ÕâÖÖʵÏÖ¿ÉÒÔ´øÀ´±Èǰһ½ÚµÄ·½Ê½¸ü´óµÄÐÔÄÜÌáÉý£¬ÒòΪ¶Á²Ù×÷¿ÉÒÔ²¢·¢½øÐС£

2.3.3 ·ÖÀëËø

ÉÏÃæÒ»¸öÀý×ÓչʾÁËÈçºÎ½«Ò»¸öµ¥¶ÀµÄËø·Ö¿ªÎª¶à¸öµ¥¶ÀµÄËø£¬ÕâÑùʹµÃ¸÷Ï߳̽ö½ö»ñµÃËûÃǽ«ÒªÐ޸ĵĶÔÏóµÄËø¾Í¿ÉÒÔÁË¡£µ«ÊÇÁíÒ»·½Ã棬ÕâÖÖ·½Ê½Ò²Ôö¼ÓÁ˳ÌÐòµÄ¸´ÔÓ¶È£¬Èç¹ûʵÏÖ²»Ç¡µ±µÄ»°Ò²¿ÉÄÜÔì³ÉËÀËø¡£

·ÖÀëËøÊÇÓë·Ö²ðËøÀàËÆµÄÒ»ÖÖ·½·¨£¬µ«ÊÇ·Ö²ðËøÊÇÔö¼ÓËøÀ´±£»¤²»Í¬µÄ´úÂëÆ¬¶Î»ò¶ÔÏ󣬶ø·ÖÀëËøÊÇʹÓò»Í¬µÄËøÀ´±£»¤²»Í¬·¶Î§µÄÊýÖµ¡£JDKµÄjava.util.concurrent°üÀïµÄConcurrentHashMap¼´Ê¹ÓÃÁËÕâÖÖ˼ÏëÀ´Ìá¸ßÄÇЩÑÏÖØÒÀÀµHashMapµÄ³ÌÐòµÄÐÔÄÜ¡£ÔÚʵÏÖÉÏ£¬ConcurrentHashMapÄÚ²¿Ê¹ÓÃÁË16¸ö²»Í¬µÄËø£¬¶ø²»ÊÇ·â×°Ò»¸öͬ²½±£»¤µÄHashMap¡£16¸öËøÃ¿Ò»¸ö¸ºÔð±£»¤ÆäÖÐ16·ÖÖ®Ò»µÄͰ루bucket£©µÄͬ²½·ÃÎÊ¡£ÕâÑùÒ»À´£¬²»Í¬µÄÏß³ÌÏëÒªÏò²»Í¬µÄ¶Î²åÈë¼üµÄʱºò£¬ÏàÓ¦µÄ²Ù×÷»áÊܵ½²»Í¬µÄËøÀ´±£»¤¡£µ«ÊÇ·´¹ýÀ´Ò²»á´øÀ´Ò»Ð©²»ºÃµÄÎÊÌ⣬±ÈÈ磬ijЩ²Ù×÷µÄÍê³ÉÏÖÔÚÐèÒª»ñÈ¡¶à¸öËø¶ø²»ÊÇÒ»¸öËø¡£Èç¹ûÄãÏëÒª¸´ÖÆÕû¸öMapµÄ»°£¬Õâ16¸öËø¶¼ÐèÒª»ñµÃ²ÅÄÜÍê³É¡£

2.3.4 Ô­×Ó²Ù×÷

ÁíÍâÒ»ÖÖ¼õÉÙËø¾ºÕùµÄ·½·¨ÊÇʹÓÃÔ­×Ó²Ù×÷£¬ÕâÖÖ·½Ê½»áÔÚÆäËûÎÄÕÂÖÐÏêϸ²ûÊöÔ­Àí¡£java.util.concurrent°ü¶ÔһЩ³£Óûù´¡Êý¾ÝÀàÐÍÌṩÁËÔ­×Ó²Ù×÷·â×°µÄÀà¡£Ô­×Ó²Ù×÷ÀàµÄʵÏÖ»ùÓÚ´¦ÀíÆ÷ÌṩµÄ¡°±È½ÏÖû»¡±¹¦ÄÜ£¨CAS£©£¬CAS²Ù×÷Ö»ÔÚµ±Ç°¼Ä´æÆ÷µÄÖµ¸ú²Ù×÷ÌṩµÄ¾ÉµÄÖµÒ»ÑùµÄʱºò²Å»áÖ´ÐиüвÙ×÷¡£

Õâ¸öÔ­Àí¿ÉÒÔÓÃÀ´ÒÔÀֹ۵ķ½Ê½À´Ôö¼ÓÒ»¸ö±äÁ¿µÄÖµ¡£Èç¹ûÎÒÃǵÄÏß³ÌÖªµÀµ±Ç°µÄÖµµÄ»°£¬¾Í»á³¢ÊÔʹÓÃCAS²Ù×÷À´Ö´ÐÐÔö¼Ó²Ù×÷¡£Èç¹ûÆÚ¼ä±ðµÄÏß³ÌÒѾ­ÐÞ¸ÄÁ˱äÁ¿µÄÖµ£¬ÄÇôÏß³ÌÌṩµÄËùνµÄµ±Ç°ÖµÒѾ­¸úÕæÊµµÄÖµ²»Ò»ÑùÁË£¬ÕâʱJVMÀ´³¢ÊÔÖØÐ»ñµÃµ±Ç°Öµ£¬²¢ÇÒÔÙ³¢ÊÔÒ»´Î£¬·´·´¸´¸´Ö±µ½³É¹¦ÎªÖ¹¡£ËäȻѭ»·²Ù×÷»áÀË·ÑһЩCPUÖÜÆÚ£¬µ«ÊÇÕâÑù×öµÄºÃ´¦ÊÇ£¬ÎÒÃDz»ÐèÒªÈκÎÐÎʽµÄͬ²½¿ØÖÆ¡£

ÏÂÃæµÄCounterÀàµÄʵÏÖ¾ÍÀûÓÃÁËÔ­×Ó²Ù×÷µÄ·½Ê½£¬Äã¿ÉÒÔ¿´µ½£¬²¢Ã»ÓÐʹÓÃÈκÎsynchronizedµÄ´úÂë¡£

public static class CounterAtomic implements Counter {

private AtomicLong customerCount = new AtomicLong();

private AtomicLong shippingCount = new AtomicLong();

public void incrementCustomer() {

customerCount.incrementAndGet();

}

public void incrementShipping() {

shippingCount.incrementAndGet();

}

public long getCustomerCount() {

return customerCount.get();

}

public long getShippingCount() {

return shippingCount.get();

}

}

 

ÓëCounterSeparateLockÀàÏà±È£¬Æ½¾ùÔËÐÐʱ¼ä´Ó39ms½µµÍµ½ÁË16ms£¬´óÔ¼½µµÍÁË58%¡£

2.3.5 ±ÜÃâÈȵã´úÂë¶Î

Ò»¸öµäÐ͵ÄLISTʵÏÖͨ¹ý»áÔÚÄÚÈÝά»¤Ò»¸ö±äÁ¿À´¼Ç¼LIST×ÔÉíËù°üº¬µÄÔªËØ¸öÊý£¬Ã¿Ò»´Î´ÓÁбíÀïɾ³ý»òÔö¼ÓÔªËØµÄʱºò£¬Õâ¸ö±äÁ¿µÄÖµ¶¼»á¸Ä±ä¡£Èç¹ûLISTÔÚµ¥Ïß³ÌÓ¦ÓÃÖÐʹÓõϰ£¬ÕâÖÖ·½Ê½Î޿ɺñ·Ç£¬Ã¿´Îµ÷ÓÃsize()ʱֱ½Ó·µ»ØÉÏÒ»´Î¼ÆËãÖ®ºóµÄÊýÖµ¾ÍÐÐÁË¡£Èç¹ûLISTÄÚ²¿²»Î¬»¤Õâ¸ö¼ÆÊý±äÁ¿µÄ»°£¬Ã¿´Îµ÷ÓÃsize()²Ù×÷¶¼»áÒý·¢LISTÖØÐ±éÀú¼ÆËãÔªËØ¸öÊý¡£

ÕâÖֺܶàÊý¾Ý½á¹¹¶¼Ê¹ÓÃÁ˵ÄÓÅ»¯·½Ê½£¬µ±µ½Á˶àÏ̻߳·¾³ÏÂʱȴ»á³ÉΪһ¸öÎÊÌâ¡£¼ÙÉèÎÒÃÇÔÚ¶à¸öÏß³ÌÖ®¼ä¹²ÏíÒ»¸öLIST£¬¶à¸öÏß³ÌͬʱµØÈ¥ÏòLISTÀïÃæÔö¼Ó»òɾ³ýÔªËØ£¬Í¬Ê±È¥²éѯ´óµÄ³¤¶È¡£Õâʱ£¬LISTÄÚ²¿µÄ¼ÆÊý±äÁ¿³ÉΪһ¸ö¹²Ïí×ÊÔ´£¬Òò´ËËùÓжÔËüµÄ·ÃÎʶ¼±ØÐë½øÐÐͬ²½´¦Àí¡£Òò´Ë£¬¼ÆÊý±äÁ¿³ÉΪÕû¸öLISTʵÏÖÖеÄÒ»¸öÈȵ㡣

ÏÂÃæµÄ´úÂëÆ¬¶ÎչʾÁËÕâ¸öÎÊÌ⣺

public static class CarRepositoryWithCounter implements CarRepository {

private Map<String, Car> cars = new HashMap<String, Car>();

private Map<String, Car> trucks = new HashMap<String, Car>();

private Object carCountSync = new Object();

private int carCount = 0;

public void addCar(Car car) {

if (car.getLicencePlate().startsWith("C")) {

synchronized (cars) {

Car foundCar = cars.get(car.getLicencePlate());

if (foundCar == null) {

cars.put(car.getLicencePlate(), car);

synchronized (carCountSync) {

carCount++;

}

}

}

} else {

synchronized (trucks) {

Car foundCar = trucks.get(car.getLicencePlate());

if (foundCar == null) {

trucks.put(car.getLicencePlate(), car);

synchronized (carCountSync) {

carCount++;

 }

}

}

}

public int getCarCount() {

synchronized (carCountSync) {

return carCount;

}

}

}

ÉÏÃæÕâ¸öCarRepositoryµÄʵÏÖÄÚ²¿ÓÐÁ½¸öLIST±äÁ¿£¬Ò»¸öÓÃÀ´·ÅÏ´³µÔªËØ£¬Ò»¸öÓÃÀ´·Å¿¨³µÔªËØ£¬Í¬Ê±£¬ÌṩÁ˲éѯÕâÁ½¸öLIST×ܹ²µÄ´óСµÄ·½·¨¡£²ÉÓõÄÓÅ»¯·½Ê½ÊÇ£¬Ã¿´ÎÌí¼ÓÒ»¸öCarÔªËØµÄʱºò£¬¶¼»áÔö¼ÓÄÚ²¿µÄ¼ÆÊý±äÁ¿µÄÖµ£¬Í¬Ê±Ôö¼ÓµÄ²Ù×÷ÊÜsynchronized±£»¤£¬·µ»Ø¼ÆÊýÖµµÄ·½·¨Ò²ÊÇÒ»Ñù¡£

ΪÁ˱ÜÃâ´øÀ´ÕâÖÖ¶îÍâµÄ´úÂëͬ²½¿ªÏú£¬¿´ÏÂÃæÁíÍâÒ»ÖÖCarRepositoryµÄʵÏÖ£ºËü²»ÔÙʹÓÃÒ»¸öÄÚ²¿µÄ¼ÆÊý±äÁ¿£¬¶øÊÇÔÚ·µ»ØÆû³µ×ÜÊýµÄ·½·¨Àïʵʱ¼ÆÊýÕâ¸öÊýÖµ¡£ÈçÏ£º

public static class CarRepositoryWithoutCounter implements CarRepository {

private Map<String, Car> cars = new HashMap<String, Car>();

private Map<String, Car> trucks = new HashMap<String, Car>();

public void addCar(Car car) {

if (car.getLicencePlate().startsWith("C")) {

synchronized (cars) {

Car foundCar = cars.get(car.getLicencePlate());

if (foundCar == null) {

cars.put(car.getLicencePlate(), car);

}

}

} else {

synchronized (trucks) {

Car foundCar = trucks.get(car.getLicencePlate());

if (foundCar == null) {

trucks.put(car.getLicencePlate(), car);

}

}

}

}

public int getCarCount() {

synchronized (cars) {

synchronized (trucks) {

return cars.size() + trucks.size();

}

}

}

}

 

ÏÖÔÚ£¬½ö½öÔÚgetCarCount()·½·¨ÀÁ½¸öLISTµÄ·ÃÎÊÐèҪͬ²½±£»¤£¬ÏñÉÏÒ»ÖÖʵÏÖÄÇÑùÿ´ÎÌí¼ÓÐÂÔªËØÊ±µÄͬ²½¿ªÏúÒѾ­²»´æÔÚÁË¡£

2.3.6 ±ÜÃâ¶ÔÏ󻺴渴ÓÃ

ÔÚJAVA VMµÄµÚÒ»°æÀʹÓÃnew¹Ø¼ü×ÖÀ´´´½¨Ð¶ÔÏóµÄ¿ªÏú±È½Ï´ó£¬Òò´Ë£¬ºÜ¶à¿ª·¢ÈËԱϰ¹ßÁËʹÓöÔÏó¸´ÓÃģʽ¡£ÎªÁ˱ÜÃâÒ»´ÎÓÖÒ»´ÎÖØ¸´´´½¨¶ÔÏ󣬿ª·¢ÈËԱά»¤Ò»¸ö»º³å³Ø£¬Ã¿´Î´´½¨Íê¶ÔÏóʵÀýÖ®ºó¿ÉÒÔ°ÑËüÃDZ£´æÔÚ»º³å³ØÀÏÂ´ÎÆäËûÏß³ÌÔÙÐèҪʹÓõÄʱºò¾Í¿ÉÒÔÖ±½Ó´Ó»º³å³ØÀïȥȡ¡£

Õ§Ò»¿´£¬ÕâÖÖ·½Ê½ÊǺܺÏÀíµÄ£¬µ«ÊÇÕâÖÖģʽÔÚ¶àÏß³ÌÓ¦ÓóÌÐòÀï»á³öÏÖÎÊÌâ¡£ÒòΪ¶ÔÏóµÄ»º³å³ØÔÚ¶à¸öÏß³ÌÖ®¼ä¹²Ïí£¬Òò´ËËùÓÐÏß³ÌÔÚ·ÃÎÊÆäÖеĶÔÏóʱµÄ²Ù×÷ÐèҪͬ²½±£»¤¡£¶øÕâÖÖͬ²½Ëù´øÀ´µÄ¿ªÏúÒѾ­´ó¹ýÁË´´½¨¶ÔÏó±¾ÉíÁË¡£µ±È»ÁË£¬´´½¨¹ý¶àµÄ¶ÔÏó»á¼ÓÖØÀ¬»ø»ØÊյĸºµ££¬µ«ÊǼ´±ã°ÑÕâ¸ö¿¼ÂÇÔÚÄÚ£¬±ÜÃâͬ²½´úÂëËù´øÀ´µÄÐÔÄÜÌáÉýÈÔȻҪºÃ¹ýʹÓöÔÏó»º´æ³ØµÄ·½Ê½¡£

±¾ÎÄËù½²ÊöµÄÕâЩÓÅ»¯·½°¸ÔÙÒ»´ÎµÄ±íÃ÷£¬Ã¿Ò»ÖÖ¿ÉÄܵÄÓÅ»¯·½Ê½ÔÚÕæÕýÓ¦ÓõÄʱºòÒ»¶¨ÐèÒª¶à¶à×ÐϸÆÀ²â¡£²»³ÉÊìµÄÓÅ»¯·½°¸±íÃæ¿´ÆðÀ´ºÃÏñºÜÓеÀÀí£¬µ«ÊÇÊÂʵÉϺÜÓпÉÄܻᷴ¹ýÀ´³ÉΪÐÔÄܵį¿¾±¡£

   
4080 ´Îä¯ÀÀ       31
Ïà¹ØÎÄÕÂ

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

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

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

Java ÖеÄÖÐÎıàÂëÎÊÌâ
Java»ù´¡ÖªÊ¶µÄÈýÊ®¸ö¾­µäÎÊ´ð
Íæ×ª Java Web Ó¦Óÿª·¢
ʹÓÃSpring¸üºÃµØ´¦ÀíStruts
ÓÃEclipse¿ª·¢iPhone WebÓ¦ÓÃ
²å¼þϵͳ¿ò¼Ü·ÖÎö

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

Struts+Spring+Hibernate/EJB+ÐÔÄÜÓÅ»¯
»ªÏÄ»ù½ð ActiveMQ Ô­ÀíÓë¹ÜÀí
ijÃñº½¹«Ë¾ Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢
ij·çµç¹«Ë¾ Java Ó¦Óÿª·¢Æ½Ì¨ÓëÇ¨ÒÆ
ÈÕÕÕ¸Û J2EEÓ¦Óÿª·¢¼¼Êõ¿ò¼ÜÓëʵ¼ù
ij¿ç¹ú¹«Ë¾ ¹¤×÷Á÷¹ÜÀíJBPM
¶«·½º½¿Õ¹«Ë¾ ¸ß¼¶J2EE¼°ÆäÇ°ÑØ¼¼Êõ