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£´æÔÚ»º³å³ØÀÏÂ´ÎÆäËûÏß³ÌÔÙÐèҪʹÓõÄʱºò¾Í¿ÉÒÔÖ±½Ó´Ó»º³å³ØÀïȥȡ¡£
Õ§Ò»¿´£¬ÕâÖÖ·½Ê½ÊǺܺÏÀíµÄ£¬µ«ÊÇÕâÖÖģʽÔÚ¶àÏß³ÌÓ¦ÓóÌÐòÀï»á³öÏÖÎÊÌâ¡£ÒòΪ¶ÔÏóµÄ»º³å³ØÔÚ¶à¸öÏß³ÌÖ®¼ä¹²Ïí£¬Òò´ËËùÓÐÏß³ÌÔÚ·ÃÎÊÆäÖеĶÔÏóʱµÄ²Ù×÷ÐèҪͬ²½±£»¤¡£¶øÕâÖÖͬ²½Ëù´øÀ´µÄ¿ªÏúÒѾ´ó¹ýÁË´´½¨¶ÔÏó±¾ÉíÁË¡£µ±È»ÁË£¬´´½¨¹ý¶àµÄ¶ÔÏó»á¼ÓÖØÀ¬»ø»ØÊյĸºµ££¬µ«ÊǼ´±ã°ÑÕâ¸ö¿¼ÂÇÔÚÄÚ£¬±ÜÃâͬ²½´úÂëËù´øÀ´µÄÐÔÄÜÌáÉýÈÔȻҪºÃ¹ýʹÓöÔÏó»º´æ³ØµÄ·½Ê½¡£
±¾ÎÄËù½²ÊöµÄÕâЩÓÅ»¯·½°¸ÔÙÒ»´ÎµÄ±íÃ÷£¬Ã¿Ò»ÖÖ¿ÉÄܵÄÓÅ»¯·½Ê½ÔÚÕæÕýÓ¦ÓõÄʱºòÒ»¶¨ÐèÒª¶à¶à×ÐϸÆÀ²â¡£²»³ÉÊìµÄÓÅ»¯·½°¸±íÃæ¿´ÆðÀ´ºÃÏñºÜÓеÀÀí£¬µ«ÊÇÊÂʵÉϺÜÓпÉÄܻᷴ¹ýÀ´³ÉΪÐÔÄܵį¿¾±¡£ |