±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚÍøÂç,½ñÌìÎÒÃÇÀ´Ð§·Â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£ºÃµÄ˼·£¬Ò²ÊÇÖµµÃ´ó¼ÒȥѧϰºÍ½è¼øµÄ¡£
|