´ó¼ÒÓ¦¸Ã¶¼ÖªµÀConcurrentHashMapÔÚ1.8µÄʱºòÓÐÁ˺ܴóµÄ¸Ä¶¯,µ±È»,ÎÒÕâÀïҪ˵µÄ¸Ä¶¯²»ÊÇÖ¸Á´±í³¤¶È´óÓÚ8¾ÍתΪºìºÚÊ÷ÕâÖÖ³£Ê¶,ÎÒҪ˵µÄÊÇConcurrentHashMapÔÚ1.8ΪʲôÓÃCAS+SynchronizedÈ¡´úSegment+ReentrantLockÁË
Ê×ÏÈ,ÎÒ¼ÙÉèÄã¶ÔCAS,Synchronized,ReentrantLockÕâЩ֪ʶºÜÁ˽â,²¢ÇÒÖªµÀAQS,×ÔÐýËø,Æ«ÏòËø,ÇáÁ¿¼¶Ëø,ÖØÁ¿¼¶ËøÕâЩ֪ʶ,Ò²ÖªµÀSynchronizedºÍReentrantLockÔÚ»½Ðѱ»¹ÒÆðÏ߳̾ºÕùµÄʱºòÓÐÊ²Ã´Çø±ð
Ê×ÏÈÎÒÃÇ˵ÏÂ1.8ÒÔǰµÄConcurrentHashMapÊÇÔõô±£Ö¤Ï̲߳¢·¢µÄ,Ê×ÏÈÔÚ³õʼ»¯ConcurrentHashMapµÄʱºò,»á³õʼ»¯Ò»¸öSegmentÊý×é,ÈÝÁ¿Îª16,¶øÃ¿¸öSegmentÄØ,¶¼¼Ì³ÐÁËReentrantLockÀà,Ò²¾ÍÊÇ˵ÿ¸öSegmentÀà±¾Éí¾ÍÊÇÒ»¸öËø,Ö®ºóSegmentÄÚ²¿ÓÖÓÐÒ»¸ötableÊý×é,¶øÃ¿¸ötableÊý×éÀïµÄË÷ÒýÊý¾ÝÄØ,ÓÖ¶ÔÓ¦×ÅÒ»¸öNodeÁ´±í.
ÄÇôÕâÑùµÄºÃ´¦ÊÇÊ²Ã´ÄØ?ÎÒÏÈ´ÓÀϰ汾µÄÌí¼ÓÁ÷³Ì˵Æð°É,ÓÉÓÚµçÄÔÀïûÓÐJDK1.7¼°ÒÔϵİ汾ÎÒû·¨¸øÄã¿´´úÂë,ËùÒÔʹÓÃÎÄ×ÖÃèÊöµÄ·½Ê½,Ê×ÏÈ,µ±ÎÒÃÇʹÓÃput·½·¨µÄʱºò,ÊǶÔÎÒÃǵÄkey½øÐÐhashÄõ½Ò»¸öÕûÐÍ,È»ºó½«ÕûÐͶÔ16ȡģ,Äõ½¶ÔÓ¦µÄSegment,Ö®ºóµ÷ÓÃSegmentµÄput·½·¨,È»ºóÉÏËø,Çë×¢Òâ,ÕâÀïlock()µÄʱºòÆäʵÊÇthis.lock(),Ò²¾ÍÊÇ˵,ÿ¸öSegmentµÄËøÊÇ·Ö¿ªµÄ
ÆäÖÐÒ»¸öÉÏËø²»»áÓ°ÏìÁíÒ»¸ö,´ËʱҲ¾Í´ú±íÁËÎÒ¿ÉÒÔÓÐÊ®Áù¸öÏ߳̽øÀ´,¶øReentrantLockÉÏËøµÄʱºòÈç¹ûÖ»ÓÐÒ»¸öÏ߳̽øÀ´,ÊDz»»áÓÐÏß³Ì¹ÒÆðµÄ²Ù×÷µÄ,Ò²¾ÍÊÇ˵ֻÐèÒªÔÚAQSÀïʹÓÃCAS¸Ä±äÒ»¸östateµÄֵΪ1,´Ëʱ¾ÍÄܶԴúÂë½øÐвÙ×÷,ÕâÑùÒ»À´,ÎÒÃǵÈÓÚ½«²¢·¢Á¿/16ÁË.
ºÃ,˵ÍêÁËÀϰ汾µÄConcurrentHashMap,ÎÒÃÇÔÙ˵˵а汾µÄ,Çë¿´ÏÂÃæµÄͼ:
Çë×¢ÒâSynchronizedÉÏËøµÄ¶ÔÏó,Çë¼Çס,SynchronizedÊÇ¿¿¶ÔÏóµÄ¶ÔÏóÍ·ºÍ´Ë¶ÔÏó¶ÔÓ¦µÄmonitorÀ´±£Ö¤ÉÏËøµÄ,Ò²¾ÍÊǶÔÏóÍ·ÀïµÄÖØÁ¿¼¶Ëø±êÖ¾Ö¸ÏòÁËmonitor,¶ømonitorÄØ,ÄÚ²¿Ôò±£´æÁËÒ»¸öµ±Ç°Ïß³Ì,Ò²¾ÍÊÇÇÀµ½ÁËËøµÄÏß³Ì.
ÄÇôÕâÀïµÄÕâ¸öfÊÇÊ²Ã´ÄØ?ËüÊÇNodeÁ´±íÀïµÄÿһ¸öNode,SynchronizedÊǽ«Ã¿Ò»¸öNode¶ÔÏó×÷ΪÁËÒ»¸öËø,ÕâÑù×öµÄºÃ´¦ÊÇÊ²Ã´ÄØ?½«ËøÏ¸»¯ÁË,³ý·ÇÁ½¸öÏß³Ìͬʱ²Ù×÷Ò»¸öNode,×¢Òâ,ÊÇÒ»¸öNode¶ø²»ÊÇÒ»¸öNodeÁ´±íŶ,ÄÇô²Å»áÕùÇÀͬһ°ÑËø.
Èç¹ûʹÓÃReentrantLockÆäʵҲ¿ÉÒÔ½«ËøÏ¸»¯³ÉÕâÑùµÄ,Ö»ÒªÈÃNodeÀà¼Ì³ÐReentrantLock¾ÍÐÐÁË,ÕâÑùµÄ»°µ÷ÓÃf.lock()¾ÍÄÜ×öµ½ºÍSynchronized(f)ͬÑùµÄЧ¹û,µ«ÎªÊ²Ã´²»ÕâÑù×öÄØ?
Çë´ó¼ÒÊÔÏëÒ»ÏÂ,ËøÒѾ±»Ï¸»¯µ½ÕâÖ̶ֳÈÁË,ÄÇô³öÏÖ²¢·¢ÕùÇÀµÄ¿ÉÄÜÐÔ»¹¸ßÂð?»¹ÓоÍÊÇ,ÄÄųöÏÖÕùÇÀÁË,Ö»ÒªÏ߳̿ÉÒÔÔÚ30µ½50´Î×ÔÐýÀïÄõ½Ëø,ÄÇôSynchronized¾Í²»»áÉý¼¶ÎªÖØÁ¿¼¶Ëø,¶øµÈ´ýµÄÏß³ÌÒ²¾Í²»Óñ»¹ÒÆð,ÎÒÃÇÒ²¾ÍÉÙÁË¹ÒÆðºÍ»½ÐÑÕâ¸öÉÏÏÂÎÄÇл»µÄ¹ý³Ì¿ªÏú.
µ«Èç¹ûÊÇReentrantLockÄØ?ËüÔòÖ»ÓÐÔÚÏß³ÌûÓÐÇÀµ½Ëø,È»ºóн¨Node½ÚµãºóÔÙ³¢ÊÔÒ»´Î¶øÒÑ,²»»á×ÔÐý,¶øÊÇÖ±½Ó±»¹ÒÆð,ÎÒÃǾͺÜÈÝÒ×»á¶à³öÏß³ÌÉÏÏÂÎÄ¿ªÏúµÄ´ú¼Û.µ±È»,ÄãÒ²¿ÉÒÔʹÓÃtryLock(),µ«ÊÇÕâÑùÓÖ³öÏÖÁËÒ»¸öÎÊÌâ,ÄãÔõô֪µÀtryLockµÄʱ¼äÄØ?ÔÚʱ¼ä·¶Î§ÀﻹºÃ,¼ÙÈ糬¹ýÁËÄØ?
ËùÒÔ,ÔÚËø±»Ï¸»¯µ½Èç´Ë³Ì¶ÈÉÏ,ʹÓÃSynchronizedÊÇ×îºÃµÄÑ¡ÔñÁË.ÕâÀïÔÙ²¹³äÒ»¾ä,SynchronizedºÍReentrantLockËûÃǵĿªÏú²î¾àÊÇÔÚÊÍ·ÅËøÊ±»½ÐÑÏ̵߳ÄÊýÁ¿,SynchronizedÊÇ»½ÐÑËø³ØÀïËùÓеÄÏß³Ì+¸ÕºÃÀ´·ÃÎʵÄÏß³Ì,¶øReentrantLockÔòÊǵ±Ç°Ï̺߳ó½øÀ´µÄµÚÒ»¸öÏß³Ì+¸ÕºÃÀ´·ÃÎʵÄÏß³Ì.
Èç¹ûÊÇÏ̲߳¢·¢Á¿²»´óµÄÇé¿öÏÂ,ÄÇôSynchronizedÒòΪ×ÔÐýËø,ÇáÁ¿¼¶ËøµÄÔÒò,²»Óý«µÈ´ýÏß³Ì¹ÒÆð,Æ«ÏòËøÉõÖÁ²»ÓÃ×ÔÐý,ËùÒÔÔÚÕâÖÖÇé¿öÏÂÒª±ÈReentrantLock¸ßЧ