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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
²»¿É²»ËµµÄJava¡°Ëø¡±ÊÂ
 
  2501  次浏览      29
 2018-11-22  
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚÍøÂç,½ñÌìÎÒÃÇÀ´Ð§·ÂReentrantLockÀàÓÃAQSÀ´¸ÄдһÏÂÕâ°ÑËø¡£ÒªÏëʹÓÃAQSΪÎÒÃÇ·þÎñ£¬Ê×ÏȵÃŪ¶®Èý¸öÎÊÌ⣺AQSÊÇʲô£¿AQSÒѾ­×öÁËʲôÒÔ¼°ÎÒÃÇ»¹ÐèÒª×öЩʲô£¿

ǰÑÔ

JavaÌṩÁËÖÖÀà·á¸»µÄËø£¬Ã¿ÖÖËøÒòÆäÌØÐԵIJ»Í¬£¬ÔÚÊʵ±µÄ³¡¾°ÏÂÄܹ»Õ¹ÏÖ³ö·Ç³£¸ßµÄЧÂÊ¡£±¾ÎÄÖ¼ÔÚ¶ÔËøÏà¹ØÔ´Â루±¾ÎÄÖеÄÔ´ÂëÀ´×ÔJDK 8£©¡¢Ê¹Óó¡¾°½øÐоÙÀý£¬Îª¶ÁÕß½éÉÜÖ÷Á÷ËøµÄ֪ʶµã£¬ÒÔ¼°²»Í¬µÄËøµÄÊÊÓó¡¾°¡£

JavaÖÐÍùÍùÊǰ´ÕÕÊÇ·ñº¬ÓÐÄ³Ò»ÌØÐÔÀ´¶¨ÒåËø£¬ÎÒÃÇͨ¹ýÌØÐÔ½«Ëø½øÐзÖ×é¹éÀ࣬ÔÙʹÓöԱȵķ½Ê½½øÐнéÉÜ£¬°ïÖú´ó¼Ò¸ü¿ì½ÝµÄÀí½âÏà¹ØÖªÊ¶¡£ÏÂÃæ¸ø³ö±¾ÎÄÄÚÈݵÄ×ÜÌå·ÖÀàĿ¼£º

1. ÀÖ¹ÛËø VS ±¯¹ÛËø

ÀÖ¹ÛËøÓ뱯¹ÛËøÊÇÒ»ÖÖ¹ãÒåÉϵĸÅÄÌåÏÖÁË¿´´ýÏß³Ìͬ²½µÄ²»Í¬½Ç¶È¡£ÔÚJavaºÍÊý¾Ý¿âÖж¼Óд˸ÅÄî¶ÔÓ¦µÄʵ¼ÊÓ¦Óá£

ÏÈ˵¸ÅÄî¡£¶ÔÓÚͬһ¸öÊý¾ÝµÄ²¢·¢²Ù×÷£¬±¯¹ÛËøÈÏΪ×Ô¼ºÔÚʹÓÃÊý¾ÝµÄʱºòÒ»¶¨ÓбðµÄÏß³ÌÀ´ÐÞ¸ÄÊý¾Ý£¬Òò´ËÔÚ»ñÈ¡Êý¾ÝµÄʱºò»áÏȼÓËø£¬È·±£Êý¾Ý²»»á±»±ðµÄÏß³ÌÐ޸ġ£JavaÖУ¬synchronized¹Ø¼ü×ÖºÍLockµÄʵÏÖÀà¶¼ÊDZ¯¹ÛËø¡£

¶øÀÖ¹ÛËøÈÏΪ×Ô¼ºÔÚʹÓÃÊý¾Ýʱ²»»áÓбðµÄÏß³ÌÐÞ¸ÄÊý¾Ý£¬ËùÒÔ²»»áÌí¼ÓËø£¬Ö»ÊÇÔÚ¸üÐÂÊý¾ÝµÄʱºòÈ¥ÅжÏ֮ǰÓÐûÓбðµÄÏ̸߳üÐÂÁËÕâ¸öÊý¾Ý¡£Èç¹ûÕâ¸öÊý¾ÝûÓб»¸üУ¬µ±Ç°Ï߳̽«×Ô¼ºÐ޸ĵÄÊý¾Ý³É¹¦Ð´Èë¡£Èç¹ûÊý¾ÝÒѾ­±»ÆäËûÏ̸߳üУ¬Ôò¸ù¾Ý²»Í¬µÄʵÏÖ·½Ê½Ö´Ðв»Í¬µÄ²Ù×÷£¨ÀýÈ籨´í»òÕß×Ô¶¯ÖØÊÔ£©¡£

ÀÖ¹ÛËøÔÚJavaÖÐÊÇͨ¹ýʹÓÃÎÞËø±à³ÌÀ´ÊµÏÖ£¬×î³£²ÉÓõÄÊÇCASËã·¨£¬JavaÔ­×ÓÀàÖеĵÝÔö²Ù×÷¾Íͨ¹ýCAS×ÔÐýʵÏֵġ£

¸ù¾Ý´ÓÉÏÃæµÄ¸ÅÄîÃèÊöÎÒÃÇ¿ÉÒÔ·¢ÏÖ£º

±¯¹ÛËøÊʺÏд²Ù×÷¶àµÄ³¡¾°£¬ÏȼÓËø¿ÉÒÔ±£Ö¤Ð´²Ù×÷ʱÊý¾ÝÕýÈ·¡£

ÀÖ¹ÛËøÊʺ϶Á²Ù×÷¶àµÄ³¡¾°£¬²»¼ÓËøµÄÌØµãÄܹ»Ê¹Æä¶Á²Ù×÷µÄÐÔÄÜ´ó·ùÌáÉý¡£

¹â˵¸ÅÄîÓÐЩ³éÏó£¬ÎÒÃÇÀ´¿´ÏÂÀÖ¹ÛËøºÍ±¯¹ÛËøµÄµ÷Ó÷½Ê½Ê¾Àý£º

// ------- ±¯¹ÛËøµÄµ÷Ó÷½Ê½ ------
// synchronized
public synchronized void testMethod() {
// ²Ù×÷ͬ²½×ÊÔ´
}
// ReentrantLock
private ReentrantLock lock = new ReentrantLock(); // ÐèÒª±£Ö¤¶à¸öÏß³ÌʹÓõÄÊÇͬһ¸öËø
public void modifyPublicResources() {
lock.lock();
// ²Ù×÷ͬ²½×ÊÔ´
lock.unlock();
}

// --------- ÀÖ¹ÛËøµÄµ÷Ó÷½Ê½ ----------
private AtomicInteger atomicInteger = new AtomicInteger(); // ÐèÒª±£Ö¤¶à¸öÏß³ÌʹÓõÄÊÇͬһ¸öAtomicInteger
atomicInteger.incrementAndGet(); //Ö´ÐÐ×ÔÔö1

 

ͨ¹ýµ÷Ó÷½Ê½Ê¾Àý£¬ÎÒÃÇ¿ÉÒÔ·¢ÏÖ±¯¹ÛËø»ù±¾¶¼ÊÇÔÚÏÔʽµÄËø¶¨Ö®ºóÔÙ²Ù×÷ͬ²½×ÊÔ´£¬¶øÀÖ¹ÛËøÔòÖ±½ÓÈ¥²Ù×÷ͬ²½×ÊÔ´¡£ÄÇô£¬ÎªºÎÀÖ¹ÛËøÄܹ»×öµ½²»Ëø¶¨Í¬²½×ÊÔ´Ò²¿ÉÒÔÕýÈ·µÄʵÏÖÏß³Ìͬ²½ÄØ£¿ÎÒÃÇͨ¹ý½éÉÜÀÖ¹ÛËøµÄÖ÷ҪʵÏÖ·½Ê½ ¡°CAS¡± µÄ¼¼ÊõÔ­ÀíÀ´Îª´ó¼Ò½â»ó¡£

CASÈ«³Æ Compare And Swap£¨±È½ÏÓë½»»»£©£¬ÊÇÒ»ÖÖÎÞËøËã·¨¡£ÔÚ²»Ê¹ÓÃËø£¨Ã»ÓÐÏ̱߳»×èÈû£©µÄÇé¿öÏÂʵÏÖ¶àÏß³ÌÖ®¼äµÄ±äÁ¿Í¬²½¡£java.util.concurrent°üÖеÄÔ­×ÓÀà¾ÍÊÇͨ¹ýCASÀ´ÊµÏÖÁËÀÖ¹ÛËø¡£

CASËã·¨Éæ¼°µ½Èý¸ö²Ù×÷Êý£º

ÐèÒª¶ÁдµÄÄÚ´æÖµ V¡£

½øÐбȽϵÄÖµ A¡£

ҪдÈëµÄÐÂÖµ B¡£

µ±ÇÒ½öµ± V µÄÖµµÈÓÚ A ʱ£¬CASͨ¹ýÔ­×Ó·½Ê½ÓÃÐÂÖµBÀ´¸üÐÂVµÄÖµ£¨¡°±È½Ï+¸üС±ÕûÌåÊÇÒ»¸öÔ­×Ó²Ù×÷£©£¬·ñÔò²»»áÖ´ÐÐÈκβÙ×÷¡£Ò»°ãÇé¿öÏ£¬¡°¸üС±ÊÇÒ»¸ö²»¶ÏÖØÊԵIJÙ×÷¡£

֮ǰÌáµ½java.util.concurrent°üÖеÄÔ­×ÓÀ࣬¾ÍÊÇͨ¹ýCASÀ´ÊµÏÖÁËÀÖ¹ÛËø£¬ÄÇôÎÒÃǽøÈëÔ­×ÓÀàAtomicIntegerµÄÔ´Â룬¿´Ò»ÏÂAtomicIntegerµÄ¶¨Ò壺

¸ù¾Ý¶¨ÒåÎÒÃÇ¿ÉÒÔ¿´³ö¸÷ÊôÐÔµÄ×÷Óãº

unsafe£º »ñÈ¡²¢²Ù×÷ÄÚ´æµÄÊý¾Ý¡£

valueOffset£º ´æ´¢valueÔÚAtomicIntegerÖÐµÄÆ«ÒÆÁ¿¡£

value£º ´æ´¢AtomicIntegerµÄintÖµ£¬¸ÃÊôÐÔÐèÒª½èÖúvolatile¹Ø¼ü×Ö±£Ö¤ÆäÔÚÏ̼߳äÊǿɼûµÄ¡£

½ÓÏÂÀ´£¬ÎÒÃDz鿴AtomicIntegerµÄ×ÔÔöº¯ÊýincrementAndGet()µÄÔ´Âëʱ£¬·¢ÏÖ×ÔÔöº¯Êýµ×²ãµ÷ÓõÄÊÇunsafe.getAndAddInt()¡£µ«ÊÇÓÉÓÚJDK±¾ÉíÖ»ÓÐUnsafe.class£¬Ö»Í¨¹ýclassÎļþÖеIJÎÊýÃû£¬²¢²»ÄܺܺõÄÁ˽ⷽ·¨µÄ×÷Óã¬ËùÒÔÎÒÃÇͨ¹ýOpenJDK 8 À´²é¿´UnsafeµÄÔ´Â룺

// ----- JDK 8 ----
// AtomicInteger ×ÔÔö·½·¨
public final int incrementAndGet() {
return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}

// Unsafe.class
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}

// ------------ OpenJDK 8 ---------
// Unsafe.java
public final int getAndAddInt(Object o, long offset, int delta) {
int v;
do {
v = getIntVolatile(o, offset);
} while (!compareAndSwapInt(o, offset, v, v + delta));
return v;
}

 

¸ù¾ÝOpenJDK 8µÄÔ´ÂëÎÒÃÇ¿ÉÒÔ¿´³ö£¬getAndAddInt()Ñ­»·»ñÈ¡¸ø¶¨¶ÔÏóoÖÐµÄÆ«ÒÆÁ¿´¦µÄÖµv£¬È»ºóÅжÏÄÚ´æÖµÊÇ·ñµÈÓÚv¡£Èç¹ûÏàµÈÔò½«ÄÚ´æÖµÉèÖÃΪ v + delta£¬·ñÔò·µ»Øfalse£¬¼ÌÐøÑ­»·½øÐÐÖØÊÔ£¬Ö±µ½ÉèÖóɹ¦²ÅÄÜÍ˳öÑ­»·£¬²¢ÇÒ½«¾ÉÖµ·µ»Ø¡£Õû¸ö¡°±È½Ï+¸üС±²Ù×÷·â×°ÔÚcompareAndSwapInt()ÖУ¬ÔÚJNIÀïÊǽèÖúÓÚÒ»¸öCPUÖ¸ÁîÍê³ÉµÄ£¬ÊôÓÚÔ­×Ó²Ù×÷£¬¿ÉÒÔ±£Ö¤¶à¸öÏ̶߳¼Äܹ»¿´µ½Í¬Ò»¸ö±äÁ¿µÄÐÞ¸ÄÖµ¡£

ºóÐøJDKͨ¹ýCPUµÄcmpxchgÖ¸Áȥ±È½Ï¼Ä´æÆ÷ÖÐµÄ A ºÍ ÄÚ´æÖеÄÖµ V¡£Èç¹ûÏàµÈ£¬¾Í°ÑҪдÈëµÄÐÂÖµ B ´æÈëÄÚ´æÖС£Èç¹û²»ÏàµÈ£¬¾Í½«ÄÚ´æÖµ V ¸³Öµ¸ø¼Ä´æÆ÷ÖеÄÖµ A¡£È»ºóͨ¹ýJava´úÂëÖеÄwhileÑ­»·Ôٴε÷ÓÃcmpxchgÖ¸Áî½øÐÐÖØÊÔ£¬Ö±µ½ÉèÖóɹ¦ÎªÖ¹¡£

CASËäÈ»ºÜ¸ßЧ£¬µ«ÊÇËüÒ²´æÔÚÈý´óÎÊÌ⣬ÕâÀïÒ²¼òµ¥ËµÒ»Ï£º

1.ABAÎÊÌâ¡£CASÐèÒªÔÚ²Ù×÷ÖµµÄʱºò¼ì²éÄÚ´æÖµÊÇ·ñ·¢Éú±ä»¯£¬Ã»Óз¢Éú±ä»¯²Å»á¸üÐÂÄÚ´æÖµ¡£µ«ÊÇÈç¹ûÄÚ´æÖµÔ­À´ÊÇA£¬ºóÀ´±ä³ÉÁËB£¬È»ºóÓÖ±ä³ÉÁËA£¬ÄÇôCAS½øÐмì²éʱ»á·¢ÏÖֵûÓз¢Éú±ä»¯£¬µ«ÊÇʵ¼ÊÉÏÊÇÓб仯µÄ¡£ABAÎÊÌâµÄ½â¾ö˼·¾ÍÊÇÔÚ±äÁ¿Ç°ÃæÌí¼Ó°æ±¾ºÅ£¬Ã¿´Î±äÁ¿¸üеÄʱºò¶¼°Ñ°æ±¾ºÅ¼ÓÒ»£¬ÕâÑù±ä»¯¹ý³Ì¾Í´Ó¡°A£­B£­A¡±±ä³ÉÁË¡°1A£­2B£­3A¡±¡£

JDK´Ó1.5¿ªÊ¼ÌṩÁËAtomicStampedReferenceÀàÀ´½â¾öABAÎÊÌ⣬¾ßÌå²Ù×÷·â×°ÔÚcompareAndSet()ÖС£compareAndSet()Ê×Ïȼì²éµ±Ç°ÒýÓú͵±Ç°±êÖ¾ÓëÔ¤ÆÚÒýÓúÍÔ¤ÆÚ±êÖ¾ÊÇ·ñÏàµÈ£¬Èç¹û¶¼ÏàµÈ£¬ÔòÒÔÔ­×Ó·½Ê½½«ÒýÓÃÖµºÍ±êÖ¾µÄÖµÉèÖÃΪ¸ø¶¨µÄ¸üÐÂÖµ¡£

2.Ñ­»·Ê±¼ä³¤¿ªÏú´ó¡£CAS²Ù×÷Èç¹û³¤Ê±¼ä²»³É¹¦£¬»áµ¼ÖÂÆäÒ»Ö±×ÔÐý£¬¸øCPU´øÀ´·Ç³£´óµÄ¿ªÏú¡£

3.Ö»Äܱ£Ö¤Ò»¸ö¹²Ïí±äÁ¿µÄÔ­×Ó²Ù×÷¡£¶ÔÒ»¸ö¹²Ïí±äÁ¿Ö´ÐвÙ×÷ʱ£¬CASÄܹ»±£Ö¤Ô­×Ó²Ù×÷£¬µ«ÊǶԶà¸ö¹²Ïí±äÁ¿²Ù×÷ʱ£¬CASÊÇÎÞ·¨±£Ö¤²Ù×÷µÄÔ­×ÓÐԵġ£

Java´Ó1.5¿ªÊ¼JDKÌṩÁËAtomicReferenceÀàÀ´±£Ö¤ÒýÓöÔÏóÖ®¼äµÄÔ­×ÓÐÔ£¬¿ÉÒ԰Ѷà¸ö±äÁ¿·ÅÔÚÒ»¸ö¶ÔÏóÀïÀ´½øÐÐCAS²Ù×÷¡£

2. ×ÔÐýËø VS ÊÊÓ¦ÐÔ×ÔÐýËø

ÔÚ½éÉÜ×ÔÐýËøÇ°£¬ÎÒÃÇÐèÒª½éÉÜһЩǰÌá֪ʶÀ´°ïÖú´ó¼ÒÃ÷°××ÔÐýËøµÄ¸ÅÄî¡£

×èÈû»ò»½ÐÑÒ»¸öJavaÏß³ÌÐèÒª²Ù×÷ϵͳÇл»CPU״̬À´Íê³É£¬ÕâÖÖ״̬ת»»ÐèÒªºÄ·Ñ´¦ÀíÆ÷ʱ¼ä¡£Èç¹ûͬ²½´úÂë¿éÖеÄÄÚÈݹýÓÚ¼òµ¥£¬×´Ì¬×ª»»ÏûºÄµÄʱ¼äÓпÉÄܱÈÓû§´úÂëÖ´ÐеÄʱ¼ä»¹Òª³¤¡£

ÔÚÐí¶à³¡¾°ÖУ¬Í¬²½×ÊÔ´µÄËø¶¨Ê±¼äºÜ¶Ì£¬ÎªÁËÕâһС¶Îʱ¼äÈ¥Çл»Ị̈߳¬Ïß³Ì¹ÒÆðºÍ»Ö¸´ÏÖ³¡µÄ»¨·Ñ¿ÉÄÜ»áÈÃϵͳµÃ²»³¥Ê§¡£Èç¹ûÎïÀí»úÆ÷Óжà¸ö´¦ÀíÆ÷£¬Äܹ»ÈÃÁ½¸ö»òÒÔÉϵÄÏß³Ìͬʱ²¢ÐÐÖ´ÐУ¬ÎÒÃǾͿÉÒÔÈúóÃæÄǸöÇëÇóËøµÄÏ̲߳»·ÅÆúCPUµÄÖ´ÐÐʱ¼ä£¬¿´¿´³ÖÓÐËøµÄÏß³ÌÊÇ·ñºÜ¿ì¾Í»áÊÍ·ÅËø¡£

¶øÎªÁËÈõ±Ç°Ï̡߳°ÉÔµÈһϡ±£¬ÎÒÃÇÐèÈõ±Ç°Ï߳̽øÐÐ×ÔÐý£¬Èç¹ûÔÚ×ÔÐýÍê³ÉºóÇ°ÃæËø¶¨Í¬²½×ÊÔ´µÄÏß³ÌÒѾ­ÊÍ·ÅÁËËø£¬ÄÇôµ±Ç°Ï߳̾ͿÉÒÔ²»±Ø×èÈû¶øÊÇÖ±½Ó»ñȡͬ²½×ÊÔ´£¬´Ó¶ø±ÜÃâÇл»Ï̵߳ĿªÏú¡£Õâ¾ÍÊÇ×ÔÐýËø¡£

×ÔÐýËø±¾ÉíÊÇÓÐȱµãµÄ£¬Ëü²»ÄÜ´úÌæ×èÈû¡£×ÔÐýµÈ´ýËäÈ»±ÜÃâÁËÏß³ÌÇл»µÄ¿ªÏú£¬µ«ËüÒªÕ¼Óô¦ÀíÆ÷ʱ¼ä¡£Èç¹ûËø±»Õ¼ÓõÄʱ¼äºÜ¶Ì£¬×ÔÐýµÈ´ýµÄЧ¹û¾Í»á·Ç³£ºÃ¡£·´Ö®£¬Èç¹ûËø±»Õ¼ÓõÄʱ¼äºÜ³¤£¬ÄÇô×ÔÐýµÄÏß³ÌÖ»»á°×ÀË·Ñ´¦ÀíÆ÷×ÊÔ´¡£ËùÒÔ£¬×ÔÐýµÈ´ýµÄʱ¼ä±ØÐëÒªÓÐÒ»¶¨µÄÏÞ¶È£¬Èç¹û×ÔÐý³¬¹ýÁËÏÞ¶¨´ÎÊý£¨Ä¬ÈÏÊÇ10´Î£¬¿ÉÒÔʹÓÃ-XX:PreBlockSpinÀ´¸ü¸Ä£©Ã»Óгɹ¦»ñµÃËø£¬¾ÍÓ¦µ±¹ÒÆðÏ̡߳£

×ÔÐýËøµÄʵÏÖÔ­ÀíͬÑùÒ²ÊÇCAS£¬AtomicIntegerÖе÷ÓÃunsafe½øÐÐ×ÔÔö²Ù×÷µÄÔ´ÂëÖеÄdo-whileÑ­»·¾ÍÊÇÒ»¸ö×ÔÐý²Ù×÷£¬Èç¹ûÐÞ¸ÄÊýֵʧ°ÜÔòͨ¹ýÑ­»·À´Ö´ÐÐ×ÔÐý£¬Ö±ÖÁÐ޸ijɹ¦¡£

×ÔÐýËøÔÚJDK1.4.2ÖÐÒýÈ룬ʹÓÃ-XX:+UseSpinningÀ´¿ªÆô¡£JDK 6ÖбäΪĬÈÏ¿ªÆô£¬²¢ÇÒÒýÈëÁË×ÔÊÊÓ¦µÄ×ÔÐýËø£¨ÊÊÓ¦ÐÔ×ÔÐýËø£©¡£

×ÔÊÊÓ¦Òâζ×Å×ÔÐýµÄʱ¼ä£¨´ÎÊý£©²»Ôٹ̶¨£¬¶øÊÇÓÉǰһ´ÎÔÚͬһ¸öËøÉϵÄ×ÔÐýʱ¼ä¼°ËøµÄÓµÓÐÕßµÄ״̬À´¾ö¶¨¡£Èç¹ûÔÚͬһ¸öËø¶ÔÏóÉÏ£¬×ÔÐýµÈ´ý¸Õ¸Õ³É¹¦»ñµÃ¹ýËø£¬²¢ÇÒ³ÖÓÐËøµÄÏß³ÌÕýÔÚÔËÐÐÖУ¬ÄÇôÐéÄâ»ú¾Í»áÈÏΪÕâ´Î×ÔÐýÒ²ÊǺÜÓпÉÄÜÔٴγɹ¦£¬½ø¶øËü½«ÔÊÐí×ÔÐýµÈ´ý³ÖÐøÏà¶Ô¸ü³¤µÄʱ¼ä¡£Èç¹û¶ÔÓÚij¸öËø£¬×ÔÐýºÜÉٳɹ¦»ñµÃ¹ý£¬ÄÇÔÚÒÔºó³¢ÊÔ»ñÈ¡Õâ¸öËøÊ±½«¿ÉÄÜÊ¡ÂÔµô×ÔÐý¹ý³Ì£¬Ö±½Ó×èÈûỊ̈߳¬±ÜÃâÀË·Ñ´¦ÀíÆ÷×ÊÔ´¡£

ÔÚ×ÔÐýËøÖÐ ÁíÓÐÈýÖÖ³£¼ûµÄËøÐÎʽ:TicketLock¡¢CLHlockºÍMCSlock£¬±¾ÎÄÖнö×öÃû´Ê½éÉÜ£¬²»×öÉîÈë½²½â£¬¸ÐÐËȤµÄͬѧ¿ÉÒÔ×ÔÐвéÔÄÏà¹Ø×ÊÁÏ¡£

3. ÎÞËø VS Æ«ÏòËø VS ÇáÁ¿¼¶Ëø VS ÖØÁ¿¼¶Ëø

ÕâËÄÖÖËøÊÇÖ¸ËøµÄ״̬£¬×¨ÃÅÕë¶ÔsynchronizedµÄ¡£ÔÚ½éÉÜÕâËÄÖÖËø×´Ì¬Ö®Ç°»¹ÐèÒª½éÉÜһЩ¶îÍâµÄ֪ʶ¡£

Ê×ÏÈΪʲôSynchronizedÄÜʵÏÖÏß³Ìͬ²½£¿

ÔڻشðÕâ¸öÎÊÌâ֮ǰÎÒÃÇÐèÒªÁ˽âÁ½¸öÖØÒªµÄ¸ÅÄ¡°Java¶ÔÏóÍ·¡±¡¢¡°Monitor¡±¡£

Java¶ÔÏóÍ·

synchronizedÊDZ¯¹ÛËø£¬ÔÚ²Ù×÷ͬ²½×ÊԴ֮ǰÐèÒª¸øÍ¬²½×ÊÔ´ÏȼÓËø£¬Õâ°ÑËø¾ÍÊÇ´æÔÚJava¶ÔÏóÍ·ÀïµÄ£¬¶øJava¶ÔÏóÍ·ÓÖÊÇÊ²Ã´ÄØ£¿

ÎÒÃÇÒÔHotspotÐéÄâ»úΪÀý£¬HotspotµÄ¶ÔÏóÍ·Ö÷Òª°üÀ¨Á½²¿·ÖÊý¾Ý£ºMark Word£¨±ê¼Ç×ֶΣ©¡¢Klass Pointer£¨ÀàÐÍÖ¸Õ룩¡£

Mark Word£ºÄ¬ÈÏ´æ´¢¶ÔÏóµÄHashCode£¬·Ö´úÄêÁäºÍËø±ê־λÐÅÏ¢¡£ÕâЩÐÅÏ¢¶¼ÊÇÓë¶ÔÏó×ÔÉí¶¨ÒåÎ޹صÄÊý¾Ý£¬ËùÒÔMark Word±»Éè¼Æ³ÉÒ»¸ö·Ç¹Ì¶¨µÄÊý¾Ý½á¹¹ÒÔ±ãÔÚ¼«Ð¡µÄ¿Õ¼äÄÚ´æ´æ´¢¾¡Á¿¶àµÄÊý¾Ý¡£Ëü»á¸ù¾Ý¶ÔÏóµÄ״̬¸´ÓÃ×Ô¼ºµÄ´æ´¢¿Õ¼ä£¬Ò²¾ÍÊÇ˵ÔÚÔËÐÐÆÚ¼äMark WordÀï´æ´¢µÄÊý¾Ý»áËæ×ÅËø±ê־λµÄ±ä»¯¶ø±ä»¯¡£

Klass Point£º¶ÔÏóÖ¸ÏòËüµÄÀàÔªÊý¾ÝµÄÖ¸Õ룬ÐéÄâ»úͨ¹ýÕâ¸öÖ¸ÕëÀ´È·¶¨Õâ¸ö¶ÔÏóÊÇÄĸöÀàµÄʵÀý¡£

Monitor

Monitor¿ÉÒÔÀí½âΪһ¸öͬ²½¹¤¾ß»òÒ»ÖÖͬ²½»úÖÆ£¬Í¨³£±»ÃèÊöΪһ¸ö¶ÔÏó¡£Ã¿Ò»¸öJava¶ÔÏó¾ÍÓÐÒ»°Ñ¿´²»¼ûµÄËø£¬³ÆÎªÄÚ²¿Ëø»òÕßMonitorËø¡£

MonitorÊÇÏß³Ì˽ÓеÄÊý¾Ý½á¹¹£¬Ã¿Ò»¸öÏ̶߳¼ÓÐÒ»¸ö¿ÉÓÃmonitor recordÁÐ±í£¬Í¬Ê±»¹ÓÐÒ»¸öÈ«¾ÖµÄ¿ÉÓÃÁÐ±í¡£Ã¿Ò»¸ö±»Ëø×¡µÄ¶ÔÏó¶¼»áºÍÒ»¸ömonitor¹ØÁª£¬Í¬Ê±monitorÖÐÓÐÒ»¸öOwner×ֶδæ·ÅÓµÓиÃËøµÄÏ̵߳ÄΨһ±êʶ£¬±íʾ¸ÃËø±»Õâ¸öÏß³ÌÕ¼Óá£

ÏÖÔÚ»°Ìâ»Øµ½synchronized£¬synchronizedͨ¹ýMonitorÀ´ÊµÏÖÏß³Ìͬ²½£¬MonitorÊÇÒÀÀµÓڵײãµÄ²Ù×÷ϵͳµÄMutex Lock£¨»¥³âËø£©À´ÊµÏÖµÄÏß³Ìͬ²½¡£

ÈçͬÎÒÃÇÔÚ×ÔÐýËøÖÐÌáµ½µÄ¡°×èÈû»ò»½ÐÑÒ»¸öJavaÏß³ÌÐèÒª²Ù×÷ϵͳÇл»CPU״̬À´Íê³É£¬ÕâÖÖ״̬ת»»ÐèÒªºÄ·Ñ´¦ÀíÆ÷ʱ¼ä¡£Èç¹ûͬ²½´úÂë¿éÖеÄÄÚÈݹýÓÚ¼òµ¥£¬×´Ì¬×ª»»ÏûºÄµÄʱ¼äÓпÉÄܱÈÓû§´úÂëÖ´ÐеÄʱ¼ä»¹Òª³¤¡±¡£ÕâÖÖ·½Ê½¾ÍÊÇsynchronized×î³õʵÏÖͬ²½µÄ·½Ê½£¬Õâ¾ÍÊÇJDK 6֮ǰsynchronizedЧÂʵ͵ÄÔ­Òò¡£ÕâÖÖÒÀÀµÓÚ²Ù×÷ϵͳMutex LockËùʵÏÖµÄËøÎÒÃdzÆÖ®Îª¡°ÖØÁ¿¼¶Ëø¡±£¬JDK 6ÖÐΪÁ˼õÉÙ»ñµÃËøºÍÊÍ·ÅËø´øÀ´µÄÐÔÄÜÏûºÄ£¬ÒýÈëÁË¡°Æ«ÏòËø¡±ºÍ¡°ÇáÁ¿¼¶Ëø¡±¡£

ËùÒÔÄ¿Ç°ËøÒ»¹²ÓÐ4ÖÖ״̬£¬¼¶±ð´ÓµÍµ½¸ßÒÀ´ÎÊÇ£ºÎÞËø¡¢Æ«ÏòËø¡¢ÇáÁ¿¼¶ËøºÍÖØÁ¿¼¶Ëø¡£Ëø×´Ì¬Ö»ÄÜÉý¼¶²»Äܽµ¼¶¡£

ͨ¹ýÉÏÃæµÄ½éÉÜ£¬ÎÒÃǶÔsynchronizedµÄ¼ÓËø»úÖÆÒÔ¼°Ïà¹ØÖªÊ¶ÓÐÁËÒ»¸öÁ˽⣬ÄÇôÏÂÃæÎÒÃǸø³öËÄÖÖËø×´Ì¬¶ÔÓ¦µÄµÄMark WordÄÚÈÝ£¬È»ºóÔٷֱ𽲽âËÄÖÖËø×´Ì¬µÄ˼·ÒÔ¼°Ìص㣺

ÎÞËø

ÎÞËøÃ»ÓжÔ×ÊÔ´½øÐÐËø¶¨£¬ËùÓеÄÏ̶߳¼ÄÜ·ÃÎʲ¢ÐÞ¸Äͬһ¸ö×ÊÔ´£¬µ«Í¬Ê±Ö»ÓÐÒ»¸öÏß³ÌÄÜÐ޸ijɹ¦¡£

ÎÞËøµÄÌØµã¾ÍÊÇÐ޸IJÙ×÷ÔÚÑ­»·ÄÚ½øÐУ¬Ï̻߳᲻¶ÏµÄ³¢ÊÔÐ޸Ĺ²Ïí×ÊÔ´¡£Èç¹ûûÓгåÍ»¾ÍÐ޸ijɹ¦²¢Í˳ö£¬·ñÔò¾Í»á¼ÌÐøÑ­»·³¢ÊÔ¡£Èç¹ûÓжà¸öÏß³ÌÐÞ¸Äͬһ¸öÖµ£¬±Ø¶¨»áÓÐÒ»¸öÏß³ÌÄÜÐ޸ijɹ¦£¬¶øÆäËûÐÞ¸Äʧ°ÜµÄÏ̻߳᲻¶ÏÖØÊÔÖ±µ½Ð޸ijɹ¦¡£ÉÏÃæÎÒÃǽéÉܵÄCASÔ­Àí¼°Ó¦Óü´ÊÇÎÞËøµÄʵÏÖ¡£ÎÞËøÎÞ·¨È«Ãæ´úÌæÓÐËø£¬µ«ÎÞËøÔÚijЩ³¡ºÏϵÄÐÔÄÜÊǷdz£¸ßµÄ¡£

Æ«ÏòËø

Æ«ÏòËøÊÇÖ¸Ò»¶Îͬ²½´úÂëÒ»Ö±±»Ò»¸öÏß³ÌËù·ÃÎÊ£¬ÄÇô¸ÃÏ̻߳á×Ô¶¯»ñÈ¡Ëø£¬½µµÍ»ñÈ¡ËøµÄ´ú¼Û¡£

ÔÚ´ó¶àÊýÇé¿öÏ£¬Ëø×ÜÊÇÓÉͬһÏ̶߳à´Î»ñµÃ£¬²»´æÔÚ¶àÏ߳̾ºÕù£¬ËùÒÔ³öÏÖÁËÆ«ÏòËø¡£ÆäÄ¿±ê¾ÍÊÇÔÚÖ»ÓÐÒ»¸öÏß³ÌÖ´ÐÐͬ²½´úÂë¿éʱÄܹ»Ìá¸ßÐÔÄÜ¡£

µ±Ò»¸öÏ̷߳ÃÎÊͬ²½´úÂë¿é²¢»ñÈ¡ËøÊ±£¬»áÔÚMark WordÀï´æ´¢ËøÆ«ÏòµÄÏß³ÌID¡£ÔÚÏ߳̽øÈëºÍÍ˳öͬ²½¿éʱ²»ÔÙͨ¹ýCAS²Ù×÷À´¼ÓËøºÍ½âËø£¬¶øÊǼì²âMark WordÀïÊÇ·ñ´æ´¢×ÅÖ¸Ïòµ±Ç°Ïß³ÌµÄÆ«ÏòËø¡£ÒýÈëÆ«ÏòËøÊÇΪÁËÔÚÎÞ¶àÏ߳̾ºÕùµÄÇé¿öϾ¡Á¿¼õÉÙ²»±ØÒªµÄÇáÁ¿¼¶ËøÖ´Ðз¾¶£¬ÒòΪÇáÁ¿¼¶ËøµÄ»ñÈ¡¼°ÊÍ·ÅÒÀÀµ¶à´ÎCASÔ­×ÓÖ¸Á¶øÆ«ÏòËøÖ»ÐèÒªÔÚÖû»ThreadIDµÄʱºòÒÀÀµÒ»´ÎCASÔ­×ÓÖ¸Áî¼´¿É¡£

Æ«ÏòËøÖ»ÓÐÓöµ½ÆäËûÏ̳߳¢ÊÔ¾ºÕùÆ«ÏòËøÊ±£¬³ÖÓÐÆ«ÏòËøµÄÏ̲߳ŻáÊÍ·ÅËø£¬Ï̲߳»»áÖ÷¶¯ÊÍ·ÅÆ«ÏòËø¡£Æ«ÏòËøµÄ³·Ïú£¬ÐèÒªµÈ´ýÈ«¾Ö°²È«µã£¨ÔÚÕâ¸öʱ¼äµãÉÏûÓÐ×Ö½ÚÂëÕýÔÚÖ´ÐУ©£¬Ëü»áÊ×ÏÈÔÝÍ£ÓµÓÐÆ«ÏòËøµÄỊ̈߳¬ÅжÏËø¶ÔÏóÊÇ·ñ´¦ÓÚ±»Ëø¶¨×´Ì¬¡£³·ÏúÆ«ÏòËøºó»Ö¸´µ½ÎÞËø£¨±ê־λΪ¡°01¡±£©»òÇáÁ¿¼¶Ëø£¨±ê־λΪ¡°00¡±£©µÄ״̬¡£

Æ«ÏòËøÔÚJDK 6¼°ÒÔºóµÄJVMÀïÊÇĬÈÏÆôÓõġ£¿ÉÒÔͨ¹ýJVM²ÎÊý¹Ø±ÕÆ«ÏòËø£º-XX:-UseBiasedLocking=false£¬¹Ø±ÕÖ®ºó³ÌÐòĬÈÏ»á½øÈëÇáÁ¿¼¶Ëø×´Ì¬¡£

ÇáÁ¿¼¶Ëø

ÊÇÖ¸µ±ËøÊÇÆ«ÏòËøµÄʱºò£¬±»ÁíÍâµÄÏß³ÌËù·ÃÎÊ£¬Æ«ÏòËø¾Í»áÉý¼¶ÎªÇáÁ¿¼¶Ëø£¬ÆäËûÏ̻߳áͨ¹ý×ÔÐýµÄÐÎʽ³¢ÊÔ»ñÈ¡Ëø£¬²»»á×èÈû£¬´Ó¶øÌá¸ßÐÔÄÜ¡£

ÔÚ´úÂë½øÈëͬ²½¿éµÄʱºò£¬Èç¹ûͬ²½¶ÔÏóËø×´Ì¬ÎªÎÞËø×´Ì¬£¨Ëø±ê־λΪ¡°01¡±×´Ì¬£¬ÊÇ·ñΪƫÏòËøÎª¡°0¡±£©£¬ÐéÄâ»úÊ×ÏȽ«ÔÚµ±Ç°Ï̵߳ÄÕ»Ö¡Öн¨Á¢Ò»¸öÃûÎªËø¼Ç¼£¨Lock Record£©µÄ¿Õ¼ä£¬ÓÃÓÚ´æ´¢Ëø¶ÔÏóĿǰµÄMark WordµÄ¿½±´£¬È»ºó¿½±´¶ÔÏóÍ·ÖеÄMark Word¸´ÖƵ½Ëø¼Ç¼ÖС£

¿½±´³É¹¦ºó£¬ÐéÄâ»ú½«Ê¹ÓÃCAS²Ù×÷³¢ÊÔ½«¶ÔÏóµÄMark Word¸üÐÂΪָÏòLock RecordµÄÖ¸Õ룬²¢½«Lock RecordÀïµÄownerÖ¸ÕëÖ¸Ïò¶ÔÏóµÄMark Word¡£

Èç¹ûÕâ¸ö¸üж¯×÷³É¹¦ÁË£¬ÄÇôÕâ¸öÏ߳̾ÍÓµÓÐÁ˸öÔÏóµÄËø£¬²¢ÇÒ¶ÔÏóMark WordµÄËø±ê־λÉèÖÃΪ¡°00¡±£¬±íʾ´Ë¶ÔÏó´¦ÓÚÇáÁ¿¼¶Ëø¶¨×´Ì¬¡£

Èç¹ûÇáÁ¿¼¶ËøµÄ¸üвÙ×÷ʧ°ÜÁË£¬ÐéÄâ»úÊ×ÏÈ»á¼ì²é¶ÔÏóµÄMark WordÊÇ·ñÖ¸Ïòµ±Ç°Ï̵߳ÄÕ»Ö¡£¬Èç¹ûÊǾÍ˵Ã÷µ±Ç°Ïß³ÌÒѾ­ÓµÓÐÁËÕâ¸ö¶ÔÏóµÄËø£¬ÄǾͿÉÒÔÖ±½Ó½øÈëͬ²½¿é¼ÌÐøÖ´ÐУ¬·ñÔò˵Ã÷¶à¸öÏ߳̾ºÕùËø¡£

Èôµ±Ç°Ö»ÓÐÒ»¸öµÈ´ýỊ̈߳¬Ôò¸ÃÏß³Ìͨ¹ý×ÔÐý½øÐеȴý¡£µ«Êǵ±×ÔÐý³¬¹ýÒ»¶¨µÄ´ÎÊý£¬»òÕßÒ»¸öÏß³ÌÔÚ³ÖÓÐËø£¬Ò»¸öÔÚ×ÔÐý£¬ÓÖÓеÚÈý¸öÀ´·Ãʱ£¬ÇáÁ¿¼¶ËøÉý¼¶ÎªÖØÁ¿¼¶Ëø¡£

ÖØÁ¿¼¶Ëø

Éý¼¶ÎªÖØÁ¿¼¶ËøÊ±£¬Ëø±êÖ¾µÄ״ֵ̬±äΪ¡°10¡±£¬´ËʱMark WordÖд洢µÄÊÇÖ¸ÏòÖØÁ¿¼¶ËøµÄÖ¸Õ룬´ËʱµÈ´ýËøµÄÏ̶߳¼»á½øÈë×èÈû״̬¡£

ÕûÌåµÄËø×´Ì¬Éý¼¶Á÷³ÌÈçÏ£º

×ÛÉÏ£¬Æ«ÏòËøÍ¨¹ý¶Ô±ÈMark Word½â¾ö¼ÓËøÎÊÌ⣬±ÜÃâÖ´ÐÐCAS²Ù×÷¡£¶øÇáÁ¿¼¶ËøÊÇͨ¹ýÓÃCAS²Ù×÷ºÍ×ÔÐýÀ´½â¾ö¼ÓËøÎÊÌ⣬±ÜÃâÏß³Ì×èÈûºÍ»½ÐѶøÓ°ÏìÐÔÄÜ¡£ÖØÁ¿¼¶ËøÊǽ«³ýÁËÓµÓÐËøµÄÏß³ÌÒÔÍâµÄÏ̶߳¼×èÈû¡£

4. ¹«Æ½Ëø VS ·Ç¹«Æ½Ëø

¹«Æ½ËøÊÇÖ¸¶à¸öḬ̈߳´ÕÕÉêÇëËøµÄ˳ÐòÀ´»ñÈ¡Ëø£¬Ïß³ÌÖ±½Ó½øÈë¶ÓÁÐÖÐÅŶӣ¬¶ÓÁÐÖеĵÚÒ»¸öÏ̲߳ÅÄÜ»ñµÃËø¡£¹«Æ½ËøµÄÓŵãÊǵȴýËøµÄÏ̲߳»»á¶öËÀ¡£È±µãÊÇÕûÌåÍÌÍÂЧÂÊÏà¶Ô·Ç¹«Æ½ËøÒªµÍ£¬µÈ´ý¶ÓÁÐÖгýµÚÒ»¸öÏß³ÌÒÔÍâµÄËùÓÐÏ̶߳¼»á×èÈû£¬CPU»½ÐÑ×èÈûÏ̵߳ĿªÏú±È·Ç¹«Æ½Ëø´ó¡£

·Ç¹«Æ½ËøÊǶà¸öÏ̼߳ÓËøÊ±Ö±½Ó³¢ÊÔ»ñÈ¡Ëø£¬»ñÈ¡²»µ½²Å»áµ½µÈ´ý¶ÓÁеĶÓβµÈ´ý¡£µ«Èç¹û´ËÊ±Ëø¸ÕºÃ¿ÉÓã¬ÄÇôÕâ¸öÏ߳̿ÉÒÔÎÞÐè×èÈûÖ±½Ó»ñÈ¡µ½Ëø£¬ËùÒԷǹ«Æ½ËøÓпÉÄܳöÏÖºóÉêÇëËøµÄÏß³ÌÏÈ»ñÈ¡ËøµÄ³¡¾°¡£·Ç¹«Æ½ËøµÄÓŵãÊÇ¿ÉÒÔ¼õÉÙ»½ÆðÏ̵߳ĿªÏú£¬ÕûÌåµÄÍÌÍÂЧÂʸߣ¬ÒòΪÏß³ÌÓм¸Âʲ»×èÈûÖ±½Ó»ñµÃËø£¬CPU²»±Ø»½ÐÑËùÓÐÏ̡߳£È±µãÊÇ´¦Óڵȴý¶ÓÁÐÖеÄÏ߳̿ÉÄÜ»á¶öËÀ£¬»òÕߵȺܾòŻá»ñµÃËø¡£

Ö±½ÓÓÃÓïÑÔÃèÊö¿ÉÄÜÓеã³éÏó£¬ÕâÀï×÷ÕßÓôӱ𴦿´µ½µÄÒ»¸öÀý×ÓÀ´½²ÊöһϹ«Æ½ËøºÍ·Ç¹«Æ½Ëø¡£

ÈçÉÏͼËùʾ£¬¼ÙÉèÓÐÒ»¿ÚË®¾®£¬ÓйÜÀíÔ±¿´ÊØ£¬¹ÜÀíÔ±ÓÐÒ»°ÑËø£¬Ö»ÓÐÄõ½ËøµÄÈ˲ÅÄܹ»´òË®£¬´òÍêˮҪ°ÑËø»¹¸ø¹ÜÀíÔ±¡£Ã¿¸ö¹ýÀ´´òË®µÄÈ˶¼Òª¹ÜÀíÔ±µÄÔÊÐí²¢Äõ½ËøÖ®ºó²ÅÄÜÈ¥´òË®£¬Èç¹ûÇ°ÃæÓÐÈËÕýÔÚ´òË®£¬ÄÇôÕâ¸öÏëÒª´òË®µÄÈ˾ͱØÐëÅŶӡ£¹ÜÀíÔ±»á²é¿´ÏÂÒ»¸öҪȥ´òË®µÄÈËÊDz»ÊǶÓÎéÀïÅÅ×îÇ°ÃæµÄÈË£¬Èç¹ûÊǵϰ£¬²Å»á¸øÄãËøÈÃÄãÈ¥´òË®£»Èç¹ûÄã²»ÊÇÅŵÚÒ»µÄÈË£¬¾Í±ØÐëÈ¥¶ÓβÅŶӣ¬Õâ¾ÍÊǹ«Æ½Ëø¡£

µ«ÊǶÔÓڷǹ«Æ½Ëø£¬¹ÜÀíÔ±¶Ô´òË®µÄÈËûÓÐÒªÇó¡£¼´Ê¹µÈ´ý¶ÓÎéÀïÓÐÅŶӵȴýµÄÈË£¬µ«Èç¹ûÔÚÉÏÒ»¸öÈ˸մòÍêË®°ÑËø»¹¸ø¹ÜÀíÔ±¶øÇÒ¹ÜÀíÔ±»¹Ã»ÓÐÔÊÐíµÈ´ý¶ÓÎéÀïÏÂÒ»¸öÈËÈ¥´òˮʱ£¬¸ÕºÃÀ´ÁËÒ»¸ö²å¶ÓµÄÈË£¬Õâ¸ö²å¶ÓµÄÈËÊÇ¿ÉÒÔÖ±½Ó´Ó¹ÜÀíÔ±ÄÇÀïÄõ½ËøÈ¥´òË®£¬²»ÐèÒªÅŶӣ¬Ô­±¾ÅŶӵȴýµÄÈËÖ»ÄܼÌÐøµÈ´ý¡£ÈçÏÂͼËùʾ£º

½ÓÏÂÀ´ÎÒÃÇͨ¹ýReentrantLockµÄÔ´ÂëÀ´½²½â¹«Æ½ËøºÍ·Ç¹«Æ½Ëø¡£

¸ù¾Ý´úÂë¿ÉÖª£¬ReentrantLockÀïÃæÓÐÒ»¸öÄÚ²¿ÀàSync£¬Sync¼Ì³ÐAQS£¨AbstractQueuedSynchronizer£©£¬Ìí¼ÓËøºÍÊÍ·ÅËøµÄ´ó²¿·Ö²Ù×÷ʵ¼ÊÉ϶¼ÊÇÔÚSyncÖÐʵÏֵġ£ËüÓй«Æ½ËøFairSyncºÍ·Ç¹«Æ½ËøNonfairSyncÁ½¸ö×ÓÀà¡£ReentrantLockĬÈÏʹÓ÷ǹ«Æ½Ëø£¬Ò²¿ÉÒÔͨ¹ý¹¹ÔìÆ÷À´ÏÔʾµÄÖ¸¶¨Ê¹Óù«Æ½Ëø¡£

ÏÂÃæÎÒÃÇÀ´¿´Ò»Ï¹«Æ½ËøÓë·Ç¹«Æ½ËøµÄ¼ÓËø·½·¨µÄÔ´Âë:

ͨ¹ýÉÏͼÖеÄÔ´´úÂë¶Ô±È£¬ÎÒÃÇ¿ÉÒÔÃ÷ÏԵĿ´³ö¹«Æ½ËøÓë·Ç¹«Æ½ËøµÄlock()·½·¨Î¨Ò»µÄÇø±ð¾ÍÔÚÓÚ¹«Æ½ËøÔÚ»ñȡͬ²½×´Ì¬Ê±¶àÁËÒ»¸öÏÞÖÆÌõ¼þ£ºhasQueuedPredecessors()¡£

ÔÙ½øÈëhasQueuedPredecessors()£¬¿ÉÒÔ¿´µ½¸Ã·½·¨Ö÷Òª×öÒ»¼þÊÂÇ飺Ö÷ÒªÊÇÅжϵ±Ç°Ïß³ÌÊÇ·ñλÓÚͬ²½¶ÓÁÐÖеĵÚÒ»¸ö¡£Èç¹ûÊÇÔò·µ»Øtrue£¬·ñÔò·µ»Øfalse¡£

×ÛÉÏ£¬¹«Æ½Ëø¾ÍÊÇͨ¹ýͬ²½¶ÓÁÐÀ´ÊµÏÖ¶à¸öḬ̈߳´ÕÕÉêÇëËøµÄ˳ÐòÀ´»ñÈ¡Ëø£¬´Ó¶øÊµÏÖ¹«Æ½µÄÌØÐÔ¡£·Ç¹«Æ½Ëø¼ÓËøÊ±²»¿¼ÂÇÅŶӵȴýÎÊÌ⣬ֱ½Ó³¢ÊÔ»ñÈ¡Ëø£¬ËùÒÔ´æÔÚºóÉêÇëÈ´ÏÈ»ñµÃËøµÄÇé¿ö¡£

5. ¿ÉÖØÈëËø VS ·Ç¿ÉÖØÈëËø

¿ÉÖØÈëËøÓÖÃûµÝ¹éËø£¬ÊÇÖ¸ÔÚͬһ¸öÏß³ÌÔÚÍâ²ã·½·¨»ñÈ¡ËøµÄʱºò£¬ÔÙ½øÈë¸ÃÏ̵߳ÄÄڲ㷽·¨»á×Ô¶¯»ñÈ¡Ëø£¨Ç°ÌáËø¶ÔÏóµÃÊÇͬһ¸ö¶ÔÏó»òÕßclass£©£¬²»»áÒòΪ֮ǰÒѾ­»ñÈ¡¹ý»¹Ã»ÊͷŶø×èÈû¡£JavaÖÐReentrantLockºÍsynchronized¶¼ÊÇ¿ÉÖØÈëËø£¬¿ÉÖØÈëËøµÄÒ»¸öÓŵãÊÇ¿ÉÒ»¶¨³Ì¶È±ÜÃâËÀËø¡£ÏÂÃæÓÃʾÀý´úÂëÀ´½øÐзÖÎö£º

public class Widget {
public synchronized void doSomething() {
System.out.println("·½·¨1Ö´ÐÐ...");
doOthers();
}

public synchronized void doOthers() {
System.out.println("·½·¨2Ö´ÐÐ...");
}
}

 

ÔÚÉÏÃæµÄ´úÂëÖУ¬ÀàÖеÄÁ½¸ö·½·¨¶¼ÊDZ»ÄÚÖÃËøsynchronizedÐÞÊεģ¬doSomething()·½·¨Öе÷ÓÃdoOthers()·½·¨¡£ÒòΪÄÚÖÃËøÊÇ¿ÉÖØÈëµÄ£¬ËùÒÔͬһ¸öÏß³ÌÔÚµ÷ÓÃdoOthers()ʱ¿ÉÒÔÖ±½Ó»ñµÃµ±Ç°¶ÔÏóµÄËø£¬½øÈëdoOthers()½øÐвÙ×÷¡£

Èç¹ûÊÇÒ»¸ö²»¿ÉÖØÈëËø£¬ÄÇôµ±Ç°Ïß³ÌÔÚµ÷ÓÃdoOthers()֮ǰÐèÒª½«Ö´ÐÐdoSomething()ʱ»ñÈ¡µ±Ç°¶ÔÏóµÄËøÊͷŵô£¬Êµ¼ÊÉϸöÔÏóËøÒѱ»µ±Ç°Ïß³ÌËù³ÖÓУ¬ÇÒÎÞ·¨ÊÍ·Å¡£ËùÒÔ´Ëʱ»á³öÏÖËÀËø¡£

¶øÎªÊ²Ã´¿ÉÖØÈëËø¾Í¿ÉÒÔÔÚǶÌ×µ÷ÓÃʱ¿ÉÒÔ×Ô¶¯»ñµÃËøÄØ£¿ÎÒÃÇͨ¹ýͼʾºÍÔ´ÂëÀ´·Ö±ð½âÎöһϡ£

»¹ÊÇ´òË®µÄÀý×Ó£¬Óжà¸öÈËÔÚÅŶӴòË®£¬´Ëʱ¹ÜÀíÔ±ÔÊÐíËøºÍͬһ¸öÈ˵Ķà¸öˮͰ°ó¶¨¡£Õâ¸öÈËÓöà¸öˮͰ´òˮʱ£¬µÚÒ»¸öˮͰºÍËø°ó¶¨²¢´òÍêˮ֮ºó£¬µÚ¶þ¸öˮͰҲ¿ÉÒÔÖ±½ÓºÍËø°ó¶¨²¢¿ªÊ¼´òË®£¬ËùÓеÄˮͰ¶¼´òÍêˮ֮ºó´òË®ÈË²Å»á½«Ëø»¹¸ø¹ÜÀíÔ±¡£Õâ¸öÈ˵ÄËùÓдòË®Á÷³Ì¶¼Äܹ»³É¹¦Ö´ÐУ¬ºóÐøµÈ´ýµÄÈËÒ²Äܹ»´òµ½Ë®¡£Õâ¾ÍÊÇ¿ÉÖØÈëËø¡£

µ«Èç¹ûÊÇ·Ç¿ÉÖØÈëËøµÄ»°£¬´Ëʱ¹ÜÀíÔ±Ö»ÔÊÐíËøºÍͬһ¸öÈ˵ÄÒ»¸öˮͰ°ó¶¨¡£µÚÒ»¸öˮͰºÍËø°ó¶¨´òÍêˮ֮ºó²¢²»»áÊÍ·ÅËø£¬µ¼Öµڶþ¸öˮͰ²»ÄܺÍËø°ó¶¨Ò²ÎÞ·¨´òË®¡£µ±Ç°Ï̳߳öÏÖËÀËø£¬Õû¸öµÈ´ý¶ÓÁÐÖеÄËùÓÐÏ̶߳¼ÎÞ·¨±»»½ÐÑ¡£

֮ǰÎÒÃÇ˵¹ýReentrantLockºÍsynchronized¶¼ÊÇÖØÈëËø£¬ÄÇôÎÒÃÇͨ¹ýÖØÈëËøReentrantLockÒÔ¼°·Ç¿ÉÖØÈëËøNonReentrantLockµÄÔ´ÂëÀ´¶Ô±È·ÖÎöÒ»ÏÂΪʲô·Ç¿ÉÖØÈëËøÔÚÖØ¸´µ÷ÓÃͬ²½×ÊԴʱ»á³öÏÖËÀËø¡£

Ê×ÏÈReentrantLockºÍNonReentrantLock¶¼¼Ì³Ð¸¸ÀàAQS£¬Æä¸¸ÀàAQSÖÐά»¤ÁËÒ»¸öͬ²½×´Ì¬statusÀ´¼ÆÊýÖØÈë´ÎÊý£¬status³õʼֵΪ0¡£

µ±Ï̳߳¢ÊÔ»ñÈ¡ËøÊ±£¬¿ÉÖØÈëËøÏȳ¢ÊÔ»ñÈ¡²¢¸üÐÂstatusÖµ£¬Èç¹ûstatus == 0±íʾûÓÐÆäËûÏß³ÌÔÚÖ´ÐÐͬ²½´úÂ룬Ôò°ÑstatusÖÃΪ1£¬µ±Ç°Ï߳̿ªÊ¼Ö´ÐС£Èç¹ûstatus != 0£¬ÔòÅжϵ±Ç°Ïß³ÌÊÇ·ñÊÇ»ñÈ¡µ½Õâ¸öËøµÄỊ̈߳¬Èç¹ûÊǵϰִÐÐstatus+1£¬ÇÒµ±Ç°Ï߳̿ÉÒÔÔٴλñÈ¡Ëø¡£¶ø·Ç¿ÉÖØÈëËøÊÇÖ±½ÓÈ¥»ñÈ¡²¢³¢ÊÔ¸üе±Ç°statusµÄÖµ£¬Èç¹ûstatus != 0µÄ»°»áµ¼ÖÂÆä»ñÈ¡ËøÊ§°Ü£¬µ±Ç°Ïß³Ì×èÈû¡£

ÊÍ·ÅËøÊ±£¬¿ÉÖØÈëËøÍ¬ÑùÏÈ»ñÈ¡µ±Ç°statusµÄÖµ£¬ÔÚµ±Ç°Ïß³ÌÊdzÖÓÐËøµÄÏ̵߳ÄǰÌáÏ¡£Èç¹ûstatus-1 == 0£¬Ôò±íʾµ±Ç°Ïß³ÌËùÓÐÖØ¸´»ñÈ¡ËøµÄ²Ù×÷¶¼ÒѾ­Ö´ÐÐÍê±Ï£¬È»ºó¸ÃÏ̲߳ŻáÕæÕýÊÍ·ÅËø¡£¶ø·Ç¿ÉÖØÈëËøÔòÊÇÔÚÈ·¶¨µ±Ç°Ïß³ÌÊdzÖÓÐËøµÄÏß³ÌÖ®ºó£¬Ö±½Ó½«statusÖÃΪ0£¬½«ËøÊÍ·Å¡£

6. ¶ÀÏíËø VS ¹²ÏíËø

¶ÀÏíËøºÍ¹²ÏíËøÍ¬ÑùÊÇÒ»ÖÖ¸ÅÄî¡£ÎÒÃÇÏȽéÉÜһϾßÌåµÄ¸ÅÄȻºóͨ¹ýReentrantLockºÍReentrantReadWriteLockµÄÔ´ÂëÀ´½éÉܶÀÏíËøºÍ¹²ÏíËø¡£

¶ÀÏíËøÒ²½ÐÅÅËûËø£¬ÊÇÖ¸¸ÃËøÒ»´ÎÖ»Äܱ»Ò»¸öÏß³ÌËù³ÖÓС£Èç¹ûÏß³ÌT¶ÔÊý¾ÝA¼ÓÉÏÅÅËüËøºó£¬ÔòÆäËûÏ̲߳»ÄÜÔÙ¶ÔA¼ÓÈκÎÀàÐ͵ÄËø¡£»ñµÃÅÅËüËøµÄÏ̼߳´ÄܶÁÊý¾ÝÓÖÄÜÐÞ¸ÄÊý¾Ý¡£JDKÖеÄsynchronizedºÍJUCÖÐLockµÄʵÏÖÀà¾ÍÊÇ»¥³âËø¡£

¹²ÏíËøÊÇÖ¸¸ÃËø¿É±»¶à¸öÏß³ÌËù³ÖÓС£Èç¹ûÏß³ÌT¶ÔÊý¾ÝA¼ÓÉϹ²ÏíËøºó£¬ÔòÆäËûÏß³ÌÖ»ÄܶÔAÔÙ¼Ó¹²ÏíËø£¬²»ÄܼÓÅÅËüËø¡£»ñµÃ¹²ÏíËøµÄÏß³ÌÖ»ÄܶÁÊý¾Ý£¬²»ÄÜÐÞ¸ÄÊý¾Ý¡£

¶ÀÏíËøÓë¹²ÏíËøÒ²ÊÇͨ¹ýAQSÀ´ÊµÏֵģ¬Í¨¹ýʵÏÖ²»Í¬µÄ·½·¨£¬À´ÊµÏÖ¶ÀÏí»òÕß¹²Ïí¡£

ÏÂͼΪReentrantReadWriteLockµÄ²¿·ÖÔ´Â룺

ÎÒÃÇ¿´µ½ReentrantReadWriteLockÓÐÁ½°ÑËø£ºReadLockºÍWriteLock£¬ÓÉ´ÊÖªÒ⣬һ¸ö¶ÁËøÒ»¸öÐ´Ëø£¬ºÏ³Æ¡°¶ÁÐ´Ëø¡±¡£ÔÙ½øÒ»²½¹Û²ì¿ÉÒÔ·¢ÏÖReadLockºÍWriteLockÊÇ¿¿ÄÚ²¿ÀàSyncʵÏÖµÄËø¡£SyncÊÇAQSµÄÒ»¸ö×ÓÀ࣬ÕâÖֽṹÔÚCountDownLatch¡¢ReentrantLock¡¢SemaphoreÀïÃæÒ²¶¼´æÔÚ¡£

ÔÚReentrantReadWriteLockÀïÃæ£¬¶ÁËøºÍÐ´ËøµÄËøÖ÷Ìå¶¼ÊÇSync£¬µ«¶ÁËøºÍÐ´ËøµÄ¼ÓËø·½Ê½²»Ò»Ñù¡£¶ÁËøÊǹ²ÏíËø£¬Ð´ËøÊǶÀÏíËø¡£¶ÁËøµÄ¹²ÏíËø¿É±£Ö¤²¢·¢¶Á·Ç³£¸ßЧ£¬¶ø¶Áд¡¢Ð´¶Á¡¢Ð´Ð´µÄ¹ý³Ì»¥³â£¬ÒòΪ¶ÁËøºÍÐ´ËøÊÇ·ÖÀëµÄ¡£ËùÒÔReentrantReadWriteLockµÄ²¢·¢ÐÔÏà±ÈÒ»°ãµÄ»¥³âËøÓÐÁ˺ܴóÌáÉý¡£

ÄǶÁËøºÍÐ´ËøµÄ¾ßÌå¼ÓËø·½Ê½ÓÐÊ²Ã´Çø±ðÄØ£¿ÔÚÁ˽âÔ´Âë֮ǰÎÒÃÇÐèÒª»Ø¹ËÒ»ÏÂÆäËû֪ʶ¡£

ÔÚ×ʼÌá¼°AQSµÄʱºòÎÒÃÇÒ²Ìáµ½ÁËstate×ֶΣ¨intÀàÐÍ£¬32룩£¬¸Ã×Ö¶ÎÓÃÀ´ÃèÊöÓжàÉÙÏ̻߳ñ³ÖÓÐËø¡£

ÔÚ¶ÀÏíËøÖÐÕâ¸öֵͨ³£ÊÇ0»òÕß1£¨Èç¹ûÊÇÖØÈëËøµÄ»°stateÖµ¾ÍÊÇÖØÈëµÄ´ÎÊý£©£¬ÔÚ¹²ÏíËøÖÐstate¾ÍÊdzÖÓÐËøµÄÊýÁ¿¡£µ«ÊÇÔÚReentrantReadWriteLockÖÐÓжÁ¡¢Ð´Á½°ÑËø£¬ËùÒÔÐèÒªÔÚÒ»¸öÕûÐͱäÁ¿stateÉÏ·Ö±ðÃèÊö¶ÁËøºÍÐ´ËøµÄÊýÁ¿£¨»òÕßÒ²¿ÉÒÔ½Ð״̬£©¡£ÓÚÊǽ«state±äÁ¿¡°°´Î»ÇиÇзֳÉÁËÁ½¸ö²¿·Ö£¬¸ß16λ±íʾ¶ÁËø×´Ì¬£¨¶ÁËø¸öÊý£©£¬µÍ16λ±íÊ¾Ð´Ëø×´Ì¬£¨Ð´Ëø¸öÊý£©¡£ÈçÏÂͼËùʾ£º

Á˽âÁ˸ÅÄîÖ®ºóÎÒÃÇÔÙÀ´¿´´úÂ룬ÏÈ¿´Ð´ËøµÄ¼ÓËøÔ´Â룺

protected final boolean tryAcquire(int acquires) {
Thread current = Thread.currentThread();
int c = getState(); // È¡µ½µ±Ç°ËøµÄ¸öÊý
int w = exclusiveCount(c); // È¡Ð´ËøµÄ¸öÊýw
if (c != 0) { // Èç¹ûÒѾ­ÓÐÏ̳߳ÖÓÐÁËËø(c!=0)
// (Note: if c != 0 and w == 0 then shared count != 0)
if (w == 0 || current != getExclusiveOwnerThread()) // Èç¹ûдÏß³ÌÊý£¨w£©Îª0£¨»»ÑÔÖ®´æÔÚ¶ÁËø£© »òÕß³ÖÓÐËøµÄÏ̲߳»Êǵ±Ç°Ï߳̾ͷµ»ØÊ§°Ü
return false;
if (w + exclusiveCount(acquires) > MAX_COUNT) // Èç¹ûдÈëËøµÄÊýÁ¿´óÓÚ×î´óÊý£¨65535£¬2µÄ16´Î·½-1£©¾ÍÅ׳öÒ»¸öError¡£
throw new Error("Maximum lock count exceeded");
// Reentrant acquire
setState(c + acquires);
return true;
}
if (writerShouldBlock() || !compareAndSetState(c, c + acquires)) // Èç¹ûµ±ÇÒдÏß³ÌÊýΪ0£¬²¢ÇÒµ±Ç°Ïß³ÌÐèÒª×èÈûÄÇô¾Í·µ»ØÊ§°Ü£»»òÕßÈç¹ûͨ¹ýCASÔö¼ÓдÏß³ÌÊýʧ°ÜÒ²·µ»ØÊ§°Ü¡£
return false;
setExclusiveOwnerThread(current); // Èç¹ûc=0£¬w=0»òÕßc>0£¬w>0£¨ÖØÈ룩£¬ÔòÉèÖõ±Ç°Ï̻߳òËøµÄÓµÓÐÕß
return true;
}

 

Õâ¶Î´úÂëÊ×ÏÈÈ¡µ½µ±Ç°ËøµÄ¸öÊýc£¬È»ºóÔÙͨ¹ýcÀ´»ñÈ¡Ð´ËøµÄ¸öÊýw¡£ÒòÎªÐ´ËøÊǵÍ16룬ËùÒÔÈ¡µÍ16λµÄ×î´óÖµÓ뵱ǰµÄc×öÓëÔËË㣨 int w = exclusiveCount(c); £©£¬¸ß16λºÍ0ÓëÔËËãºóÊÇ0£¬Ê£ÏµľÍÊǵÍλÔËËãµÄÖµ£¬Í¬Ê±Ò²ÊdzÖÓÐÐ´ËøµÄÏß³ÌÊýÄ¿¡£

ÔÚÈ¡µ½Ð´ËøÏ̵߳ÄÊýÄ¿ºó£¬Ê×ÏÈÅжÏÊÇ·ñÒѾ­ÓÐÏ̳߳ÖÓÐÁËËø¡£Èç¹ûÒѾ­ÓÐÏ̳߳ÖÓÐÁËËø(c!=0)£¬Ôò²é¿´µ±Ç°Ð´ËøÏ̵߳ÄÊýÄ¿£¬Èç¹ûдÏß³ÌÊýΪ0£¨¼´´Ëʱ´æÔÚ¶ÁËø£©»òÕß³ÖÓÐËøµÄÏ̲߳»Êǵ±Ç°Ï߳̾ͷµ»ØÊ§°Ü£¨Éæ¼°µ½¹«Æ½ËøºÍ·Ç¹«Æ½ËøµÄʵÏÖ£©¡£

Èç¹ûдÈëËøµÄÊýÁ¿´óÓÚ×î´óÊý£¨65535£¬2µÄ16´Î·½-1£©¾ÍÅ׳öÒ»¸öError¡£

Èç¹ûµ±ÇÒдÏß³ÌÊýΪ0£¨ÄÇô¶ÁÏß³ÌÒ²Ó¦¸ÃΪ0£¬ÒòΪÉÏÃæÒѾ­´¦Àíc!=0µÄÇé¿ö£©£¬²¢ÇÒµ±Ç°Ïß³ÌÐèÒª×èÈûÄÇô¾Í·µ»ØÊ§°Ü£»Èç¹ûͨ¹ýCASÔö¼ÓдÏß³ÌÊýʧ°ÜÒ²·µ»ØÊ§°Ü¡£

Èç¹ûc=0,w=0»òÕßc>0,w>0£¨ÖØÈ룩£¬ÔòÉèÖõ±Ç°Ï̻߳òËøµÄÓµÓÐÕߣ¬·µ»Ø³É¹¦£¡

tryAcquire()³ýÁËÖØÈëÌõ¼þ£¨µ±Ç°Ïß³ÌΪ»ñÈ¡ÁËÐ´ËøµÄỊ̈߳©Ö®Í⣬Ôö¼ÓÁËÒ»¸ö¶ÁËøÊÇ·ñ´æÔÚµÄÅжϡ£Èç¹û´æÔÚ¶ÁËø£¬ÔòÐ´Ëø²»Äܱ»»ñÈ¡£¬Ô­ÒòÔÚÓÚ£º±ØÐëÈ·±£Ð´ËøµÄ²Ù×÷¶Ô¶ÁËø¿É¼û£¬Èç¹ûÔÊÐí¶ÁËøÔÚÒѱ»»ñÈ¡µÄÇé¿ö϶ÔÐ´ËøµÄ»ñÈ¡£¬ÄÇôÕýÔÚÔËÐÐµÄÆäËû¶ÁÏ߳̾ÍÎÞ·¨¸ÐÖªµ½µ±Ç°Ð´Ï̵߳IJÙ×÷¡£

Òò´Ë£¬Ö»ÓеȴýÆäËû¶ÁÏ̶߳¼ÊÍ·ÅÁ˶ÁËø£¬Ð´Ëø²ÅÄܱ»µ±Ç°Ï̻߳ñÈ¡£¬¶øÐ´ËøÒ»µ©±»»ñÈ¡£¬ÔòÆäËû¶ÁдÏ̵߳ĺóÐø·ÃÎʾù±»×èÈû¡£Ð´ËøµÄÊÍ·ÅÓëReentrantLockµÄÊͷŹý³Ì»ù±¾ÀàËÆ£¬Ã¿´ÎÊͷžù¼õÉÙд״̬£¬µ±Ð´×´Ì¬Îª0ʱ±íÊ¾Ð´ËøÒѱ»ÊÍ·Å£¬È»ºóµÈ´ýµÄ¶ÁдÏ̲߳ÅÄܹ»¼ÌÐø·ÃÎʶÁÐ´Ëø£¬Í¬Ê±Ç°´ÎдÏ̵߳ÄÐ޸ĶԺóÐøµÄ¶ÁдÏ߳̿ɼû¡£

½Ó×ÅÊǶÁËøµÄ´úÂ룺

protected final int tryAcquireShared(int unused) {
Thread current = Thread.currentThread();
int c = getState();
if (exclusiveCount(c) != 0 &&
getExclusiveOwnerThread() != current)
return -1; // Èç¹ûÆäËûÏß³ÌÒѾ­»ñÈ¡ÁËÐ´Ëø£¬Ôòµ±Ç°Ï̻߳ñÈ¡¶ÁËøÊ§°Ü£¬½øÈëµÈ´ý״̬
int r = sharedCount(c);
if (!readerShouldBlock() &&
r < MAX_COUNT &&
compareAndSetState(c, c + SHARED_UNIT)) {
if (r == 0) {
firstReader = current;
firstReaderHoldCount = 1;
} else if (firstReader == current) {
firstReaderHoldCount++;
} else {
HoldCounter rh = cachedHoldCounter;
if (rh == null || rh.tid != getThreadId(current))
cachedHoldCounter = rh = readHolds.get();
else if (rh.count == 0)
readHolds.set(rh);
rh.count++;
}
return 1;
}
return fullTryAcquireShared(current);
}

 

¿ÉÒÔ¿´µ½ÔÚtryAcquireShared(int unused)·½·¨ÖУ¬Èç¹ûÆäËûÏß³ÌÒѾ­»ñÈ¡ÁËÐ´Ëø£¬Ôòµ±Ç°Ï̻߳ñÈ¡¶ÁËøÊ§°Ü£¬½øÈëµÈ´ý״̬¡£Èç¹ûµ±Ç°Ï̻߳ñÈ¡ÁËÐ´Ëø»òÕßÐ´ËøÎ´±»»ñÈ¡£¬Ôòµ±Ç°Ị̈߳¨Ḭ̈߳²È«£¬ÒÀ¿¿CAS±£Ö¤£©Ôö¼Ó¶Á״̬£¬³É¹¦»ñÈ¡¶ÁËø¡£¶ÁËøµÄÿ´ÎÊÍ·Å£¨Ḭ̈߳²È«µÄ£¬¿ÉÄÜÓжà¸ö¶ÁÏß³ÌͬʱÊͷŶÁËø£©¾ù¼õÉÙ¶Á״̬£¬¼õÉÙµÄÖµÊÇ¡°1<<16¡±¡£ËùÒÔ¶ÁÐ´Ëø²ÅÄÜʵÏÖ¶Á¶ÁµÄ¹ý³Ì¹²Ïí£¬¶ø¶Áд¡¢Ð´¶Á¡¢Ð´Ð´µÄ¹ý³Ì»¥³â¡£

´Ëʱ£¬ÎÒÃÇÔÙ»ØÍ·¿´Ò»Ï»¥³âËøReentrantLockÖй«Æ½ËøºÍ·Ç¹«Æ½ËøµÄ¼ÓËøÔ´Â룺

ÎÒÃÇ·¢ÏÖÔÚReentrantLockËäÈ»Óй«Æ½ËøºÍ·Ç¹«Æ½ËøÁ½ÖÖ£¬µ«ÊÇËüÃÇÌí¼ÓµÄ¶¼ÊǶÀÏíËø¡£¸ù¾ÝÔ´ÂëËùʾ£¬µ±Ä³Ò»¸öÏ̵߳÷ÓÃlock·½·¨»ñÈ¡ËøÊ±£¬Èç¹ûͬ²½×ÊԴûÓб»ÆäËûÏß³ÌËø×¡£¬ÄÇôµ±Ç°Ïß³ÌÔÚʹÓÃCAS¸üÐÂstate³É¹¦ºó¾Í»á³É¹¦ÇÀÕ¼¸Ã×ÊÔ´¡£¶øÈç¹û¹«¹²×ÊÔ´±»Õ¼ÓÃÇÒ²»ÊDZ»µ±Ç°Ïß³ÌÕ¼Óã¬ÄÇô¾Í»á¼ÓËøÊ§°Ü¡£ËùÒÔ¿ÉÒÔÈ·¶¨ReentrantLockÎÞÂÛ¶Á²Ù×÷»¹ÊÇд²Ù×÷£¬Ìí¼ÓµÄËø¶¼ÊǶ¼ÊǶÀÏíËø¡£

½áÓï

±¾ÎÄJavaÖг£ÓõÄËøÒÔ¼°³£¼ûµÄËøµÄ¸ÅÄî½øÐÐÁË»ù±¾½éÉÜ£¬²¢´ÓÔ´ÂëÒÔ¼°Êµ¼ÊÓ¦ÓõĽǶȽøÐÐÁ˶ԱȷÖÎö¡£ÏÞÓÚÆª·ùÒÔ¼°¸öÈËˮƽ£¬Ã»ÓÐÔÚ±¾ÆªÎÄÕÂÖжÔËùÓÐÄÚÈݽøÐÐÉî²ã´ÎµÄ½²½â¡£

ÆäʵJava±¾ÉíÒѾ­¶ÔËø±¾Éí½øÐÐÁËÁ¼ºÃµÄ·â×°£¬½µµÍÁËÑз¢Í¬Ñ§ÔÚÆ½Ê±¹¤×÷ÖеÄʹÓÃÄѶȡ£µ«ÊÇÑз¢Í¬Ñ§Ò²ÐèÒªÊìÏ¤ËøµÄµ×²ãÔ­Àí£¬²»Í¬³¡¾°ÏÂÑ¡Ôñ×îÊʺϵÄËø¡£¶øÇÒÔ´ÂëÖеÄ˼·¶¼ÊǷdz£ºÃµÄ˼·£¬Ò²ÊÇÖµµÃ´ó¼ÒȥѧϰºÍ½è¼øµÄ¡£

 

   
2501 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

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

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

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