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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
·Ö²¼Ê½ÏµÍ³»¥³âÐÔÓëÃݵÈÐÔÎÊÌâµÄ·ÖÎöÓë½â¾ö
 
×÷Õߣº½¯×  À´Ô´£ºC¼«¿ÍÍ·Ìõ ·¢²¼ÓÚ£º 2016-11-29
  2381  次浏览      30
 

¡¾Ç°ÑÔ¡¿

Ëæ×Å»¥ÁªÍøÐÅÏ¢¼¼ÊõµÄ·ÉËÙ·¢Õ¹£¬Êý¾ÝÁ¿²»¶ÏÔö´ó£¬ÒµÎñÂß¼­Ò²ÈÕÇ÷¸´ÔÓ£¬¶ÔϵͳµÄ¸ß²¢·¢·ÃÎÊ¡¢º£Á¿Êý¾Ý´¦ÀíµÄ³¡¾°Ò²Ô½À´Ô½¶à¡£ÈçºÎÓýϵͳɱ¾ÊµÏÖϵͳµÄ¸ß¿ÉÓá¢Ò×ÉìËõ¡¢¿ÉÀ©Õ¹µÈÄ¿±ê¾ÍÏÔµÃÔ½·¢ÖØÒª¡£ÎªÁ˽â¾öÕâһϵÁÐÎÊÌ⣬ϵͳ¼Ü¹¹Ò²ÔÚ²»¶ÏÑݽø¡£´«Í³µÄ¼¯ÖÐʽϵͳÒѾ­Öð½¥ÎÞ·¨Âú×ãÒªÇ󣬷ֲ¼Ê½ÏµÍ³±»Ê¹ÓÃÔÚ¸ü¶àµÄ³¡¾°ÖС£

·Ö²¼Ê½ÏµÍ³ÓɶÀÁ¢µÄ·þÎñÆ÷ͨ¹ýÍøÂçËÉÉ¢ñîºÏ×é³É¡£ÔÚÕâ¸öϵͳÖÐÿ¸ö·þÎñÆ÷¶¼ÊÇһ̨¶ÀÁ¢µÄÖ÷»ú£¬·þÎñÆ÷Ö®¼äͨ¹ýÄÚ²¿ÍøÂçÁ¬½Ó¡£·Ö²¼Ê½ÏµÍ³ÓÐÒÔϼ¸¸öÌØµã£º

¿ÉÀ©Õ¹ÐÔ£º¿Éͨ¹ýºáÏòˮƽÀ©Õ¹Ìá¸ßϵͳµÄÐÔÄܺÍÍÌÍÂÁ¿¡£

¸ß¿É¿¿ÐÔ£º¸ßÈÝ´í£¬¼´Ê¹ÏµÍ³ÖÐһ̨»ò¼¸Ì¨¹ÊÕÏ£¬ÏµÍ³ÈÔ¿ÉÌṩ·þÎñ¡£

¸ß²¢·¢ÐÔ£º¸÷»úÆ÷²¢ÐжÀÁ¢´¦ÀíºÍ¼ÆËã¡£

Á®¼Û¸ßЧ£º¶ą̀СÐÍ»ú¶ø·Çµ¥Ì¨¸ßÐÔÄÜ»ú¡£

È»¶ø£¬ÔÚ·Ö²¼Ê½ÏµÍ³ÖУ¬Æä»·¾³µÄ¸´ÔÓ¶È¡¢ÍøÂçµÄ²»È·¶¨ÐÔ»áÔì³ÉÖîÈçʱÖÓ²»Ò»Ö¡¢¡°°Ýռͥ½«¾üÎÊÌ⡱£¨Byzantine failure£©µÈ¡£´æÔÚÓÚ¼¯ÖÐʽϵͳÖеĻúÆ÷å´»ú¡¢ÏûÏ¢¶ªÊ§µÈÎÊÌâÒ²»áÔÚ·Ö²¼Ê½»·¾³ÖбäµÃ¸ü¼Ó¸´ÔÓ¡£

»ùÓÚ·Ö²¼Ê½ÏµÍ³µÄÕâÐ©ÌØÕ÷£¬ÓÐÁ½ÖÖÎÊÌâÖð½¥³ÉΪÁË·Ö²¼Ê½»·¾³ÖÐÐèÒªÖØµã¹Ø×¢ºÍ½â¾öµÄµäÐÍÎÊÌ⣺

»¥³âÐÔÎÊÌâ¡£

ÃݵÈÐÔÎÊÌâ¡£

½ñÌìÎÒÃǾÍÕë¶ÔÕâÁ½¸öÎÊÌâÀ´½øÐзÖÎö¡£

»¥³âÐÔÎÊÌâ

ÏÈ¿´Á½¸ö³£¼ûµÄÀý×Ó£º

Àý1£ºÄ³·þÎñ¼Ç¼¹Ø¼üÊý¾ÝX£¬µ±Ç°ÖµÎª100¡£AÇëÇóÐèÒª½«XÔö¼Ó200£»Í¬Ê±£¬BÇëÇóÐèÒª½«X¼õ100¡£

ÔÚÀíÏëµÄÇé¿öÏ£¬AÏȶÁÈ¡µ½X=100£¬È»ºóXÔö¼Ó200£¬×îºóдÈëX=300¡£BÇëÇó½Ó×Å´Ó¶ÁÈ¡X=300£¬¼õÉÙ100£¬×îºóдÈëX=200¡£

È»¶øÔÚÕæÊµÇé¿öÏ£¬Èç¹û²»×öÈκδ¦Àí£¬Ôò¿ÉÄÜ»á³öÏÖ£ºAºÍBͬʱ¶ÁÈ¡µ½X=100£»AдÈë֮ǰB¶ÁÈ¡µ½X£»B±ÈAÏÈдÈëµÈÇé¿ö¡£

Àý2£ºÄ³·þÎñÌṩһ×éÈÎÎñ£¬AÇëÇóËæ»ú´ÓÈÎÎñ×éÖлñȡһ¸öÈÎÎñ£»BÇëÇóËæ»ú´ÓÈÎÎñ×éÖлñȡһ¸öÈÎÎñ¡£

ÔÚÀíÏëµÄÇé¿öÏ£¬A´ÓÈÎÎñ×éÖÐÌôѡһ¸öÈÎÎñ£¬ÈÎÎñ×éɾ³ý¸ÃÈÎÎñ£¬B´ÓʣϵĵÄÈÎÎñÖÐÔÙÌôÒ»¸ö£¬ÈÎÎñ×éɾ³ý¸ÃÈÎÎñ¡£

ͬÑùµÄ£¬ÔÚÕæÊµÇé¿öÏ£¬Èç¹û²»×öÈκδ¦Àí£¬¿ÉÄÜ»á³öÏÖAºÍBÌôÖÐÁËͬһ¸öÈÎÎñµÄÇé¿ö¡£

ÒÔÉϵÄÁ½¸öÀý×Ó£¬¶¼´æÔÚ²Ù×÷»¥³âÐÔµÄÎÊÌâ¡£»¥³âÐÔÎÊÌâÓÃͨË׵ϰÀ´½²£¬¾ÍÊǶԹ²Ïí×ÊÔ´µÄÇÀÕ¼ÎÊÌâ¡£Èç¹û²»Í¬µÄÇëÇó¶Ôͬһ¸ö»òÕßͬһ×é×ÊÔ´¶ÁÈ¡²¢ÐÞ¸Äʱ£¬ÎÞ·¨±£Ö¤°´ÐòÖ´ÐУ¬ÎÞ·¨±£Ö¤Ò»¸ö²Ù×÷µÄÔ­×ÓÐÔ£¬ÄÇô¾ÍºÜÓпÉÄÜ»á³öÏÖÔ¤ÆÚÍâµÄÇé¿ö¡£Òò´Ë²Ù×÷µÄ»¥³âÐÔÎÊÌ⣬Ҳ¿ÉÒÔÀí½âΪһ¸öÐèÒª±£Ö¤Ê±ÐòÐÔ¡¢Ô­×ÓÐÔµÄÎÊÌâ¡£

ÔÚ´«Í³µÄ»ùÓÚÊý¾Ý¿âµÄ¼Ü¹¹ÖУ¬¶ÔÓÚÊý¾ÝµÄÇÀÕ¼ÎÊÌâÍùÍùÊÇͨ¹ýÊý¾Ý¿âÊÂÎñ£¨ACID£©À´±£Ö¤µÄ¡£ÔÚ·Ö²¼Ê½»·¾³ÖУ¬³öÓÚ¶ÔÐÔÄÜÒÔ¼°Ò»ÖÂÐÔÃô¸Ð¶ÈµÄÒªÇó£¬Ê¹µÃ·Ö²¼Ê½Ëø³ÉΪÁËÒ»ÖֱȽϳ£¼û¶ø¸ßЧµÄ½â¾ö·½°¸¡£

ÊÂʵÉÏ£¬²Ù×÷»¥³âÐÔÎÊÌâÒ²²¢·Ç·Ö²¼Ê½»·¾³Ëù¶ÀÓУ¬ÔÚ´«Í³µÄ¶àÏ̡߳¢¶à½ø³ÌÇé¿öÏÂÒѾ­ÓÐÁ˺ܺõĽâ¾ö·½°¸¡£Òò´ËÔÚÑо¿·Ö²¼Ê½ËøÖ®Ç°£¬ÎÒÃÇÏÈÀ´·ÖÎöÏÂÕâÁ½ÖÖÇé¿öµÄ½â¾ö·½°¸£¬ÒÔÆÚÄܹ»¶Ô·Ö²¼Ê½ËøµÄ½â¾ö·½°¸ÌṩһЩʵÏÖ˼·¡£

¶àÏ̻߳·¾³½â¾ö·½°¸¼°Ô­Àí

½â¾ö·½°¸

¡¶Thinking in Java¡·ÊéÖÐдµ½£º

»ù±¾ÉÏËùÓеIJ¢·¢Ä£Ê½ÔÚ½â¾öÏ̳߳åÍ»ÎÊÌâµÄʱºò£¬¶¼ÊDzÉÓÃÐòÁл¯·ÃÎʹ²Ïí×ÊÔ´µÄ·½°¸¡£

ÔÚ¶àÏ̻߳·¾³ÖУ¬Ïß³ÌÖ®¼äÒòΪ¹«ÓÃһЩ´æ´¢¿Õ¼ä£¬³åÍ»ÎÊÌâʱÓз¢Éú¡£½â¾ö³åÍ»ÎÊÌâ×îÆÕ±éµÄ·½Ê½¾ÍÊÇÓû¥³âËø°Ñ¸Ã×ÊÔ´»ò¶Ô¸Ã×ÊÔ´µÄ²Ù×÷±£»¤ÆðÀ´¡£

Java JDKÖÐÌṩÁËÁ½ÖÖ»¥³âËøLockºÍsynchronized¡£²»Í¬µÄÏß³ÌÖ®¼ä¶Ôͬһ×ÊÔ´½øÐÐÇÀÕ¼£¬¸Ã×ÊԴͨ³£±íÏÖΪij¸öÀàµÄÆÕͨ³ÉÔ±±äÁ¿¡£Òò´Ë£¬ÀûÓÃReentrantLock»òÕßsynchronized½«¹²ÏíµÄ±äÁ¿¼°Æä²Ù×÷Ëø×¡£¬¼´¿É»ù±¾½â¾ö×ÊÔ´ÇÀÕ¼µÄÎÊÌâ¡£

ÏÂÃæÀ´¼òµ¥ÁÄÒ»ÁÄÁ½ÕßµÄʵÏÖÔ­Àí¡£

Ô­Àí

ReentrantLock

ReentrantLockÖ÷ÒªÀûÓÃCAS+CLH¶ÓÁÐÀ´ÊµÏÖ¡£ËüÖ§³Ö¹«Æ½ËøºÍ·Ç¹«Æ½Ëø£¬Á½ÕßµÄʵÏÖÀàËÆ¡£

CAS£ºCompare and Swap£¬±È½Ï²¢½»»»¡£CASÓÐ3¸ö²Ù×÷Êý£ºÄÚ´æÖµV¡¢Ô¤ÆÚÖµA¡¢ÒªÐ޸ĵÄÐÂÖµB¡£µ±ÇÒ½öµ±Ô¤ÆÚÖµAºÍÄÚ´æÖµVÏàͬʱ£¬½«ÄÚ´æÖµVÐÞ¸ÄΪB£¬·ñÔòʲô¶¼²»×ö¡£¸Ã²Ù×÷ÊÇÒ»¸öÔ­×Ó²Ù×÷£¬±»¹ã·ºµÄÓ¦ÓÃÔÚJavaµÄµ×²ãʵÏÖÖС£ÔÚJavaÖУ¬CASÖ÷ÒªÊÇÓÉsun.misc.UnsafeÕâ¸öÀàͨ¹ýJNIµ÷ÓÃCPUµ×²ãÖ¸ÁîʵÏÖ¡£

CLH¶ÓÁУº´øÍ·½áµãµÄË«Ïò·ÇÑ­»·Á´±í(ÈçÏÂͼËùʾ)£º

ReentrantLockµÄ»ù±¾ÊµÏÖ¿ÉÒÔ¸ÅÀ¨Îª£ºÏÈͨ¹ýCAS³¢ÊÔ»ñÈ¡Ëø¡£Èç¹û´ËʱÒѾ­ÓÐÏß³ÌÕ¼¾ÝÁËËø£¬ÄǾͼÓÈëCLH¶ÓÁв¢ÇÒ±»¹ÒÆð¡£µ±Ëø±»ÊÍ·ÅÖ®ºó£¬ÅÅÔÚCLH¶ÓÁжÓÊ×µÄÏ̻߳ᱻ»½ÐÑ£¬È»ºóCASÔٴγ¢ÊÔ»ñÈ¡Ëø¡£ÔÚÕâ¸öʱºò£¬Èç¹û£º

·Ç¹«Æ½Ëø£ºÈç¹ûͬʱ»¹ÓÐÁíÒ»¸öÏ߳̽øÀ´³¢ÊÔ»ñÈ¡£¬ÄÇôÓпÉÄÜ»áÈÃÕâ¸öÏß³ÌÇÀÏÈ»ñÈ¡£»

¹«Æ½Ëø£ºÈç¹ûͬʱ»¹ÓÐÁíÒ»¸öÏ߳̽øÀ´³¢ÊÔ»ñÈ¡£¬µ±Ëü·¢ÏÖ×Ô¼º²»ÊÇÔÚ¶ÓÊ׵ϰ£¬¾Í»áÅŵ½¶Ó⣬ÓɶÓÊ×µÄÏ̻߳ñÈ¡µ½Ëø¡£

ÏÂÃæ·ÖÎöÏÂÁ½¸öƬ¶Î£º

final boolean nonfairTryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
if (compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0) // overflow
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}

ÔÚ³¢ÊÔ»ñÈ¡ËøµÄʱºò£¬»áÏȵ÷ÓÃÉÏÃæµÄ·½·¨¡£Èç¹û״̬Ϊ0£¬Ôò±íÃ÷´ËʱÎÞÈËÕ¼ÓÐËø¡£´Ëʱ³¢ÊÔ½øÐÐset£¬Ò»µ©³É¹¦£¬Ôò³É¹¦Õ¼ÓÐËø¡£Èç¹û״̬²»Îª0£¬ÔÙÅжÏÊÇ·ñÊǵ±Ç°Ï̻߳ñÈ¡µ½Ëø¡£Èç¹ûÊǵϰ£¬½«×´Ì¬+1£¬ÒòΪ´Ëʱ¾ÍÊǵ±Ç°Ị̈߳¬ËùÒÔ²»ÓÃCAS¡£ÕâÒ²¾ÍÊÇ¿ÉÖØÈëËøµÄʵÏÖÔ­Àí¡£

final boolean acquireQueued(final Node node, int arg) {
boolean failed = true;
try {
boolean interrupted = false;
for (;;) {
final Node p = node.predecessor();
if (p == head && tryAcquire(arg)) {
setHead(node);
p.next = null; // help GC
failed = false;
return interrupted;
}
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
interrupted = true;
}
} finally {
if (failed)
cancelAcquire(node);
}
}
private final boolean parkAndCheckInterrupt() {
LockSupport.park(this);
return Thread.interrupted();
}

¸Ã·½·¨ÊÇÔÚ³¢ÊÔ»ñÈ¡ËøÊ§°Ü¼ÓÈëCHL¶Óβ֮ºó£¬Èç¹û·¢ÏÖǰÐò½ÚµãÊÇhead£¬ÔòCASÔÙ³¢ÊÔ»ñȡһ´Î¡£·ñÔò£¬Ôò»á¸ù¾ÝǰÐò½ÚµãµÄ״̬ÅжÏÊÇ·ñÐèÒª×èÈû¡£Èç¹ûÐèÒª×èÈû£¬Ôòµ÷ÓÃLockSupportµÄpark·½·¨×èÈû¸ÃÏ̡߳£

synchronized

ÔÚJavaÓïÑÔÖдæÔÚÁ½ÖÖÄÚ½¨µÄsynchronizedÓï·¨£ºsynchronizedÓï¾ä¡¢synchronized·½·¨¡£

synchronizedÓï¾ä£ºµ±Ô´´úÂë±»±àÒë³É×Ö½ÚÂëµÄʱºò£¬»áÔÚͬ²½¿éµÄÈë¿ÚλÖúÍÍ˳öλÖ÷ֱð²åÈëmonitorenterºÍmonitorexit×Ö½ÚÂëÖ¸Áî;

synchronized·½·¨£ºÔÚClassÎļþµÄ·½·¨±íÖн«¸Ã·½·¨µÄaccess_flags×Ö¶ÎÖеÄsynchronized±ê־λÖÃ1¡£Õâ¸öÔÚspecificationÖÐûÓÐÃ÷ȷ˵Ã÷¡£

ÔÚJavaÐéÄâ»úµÄspecificationÖУ¬ÓйØÓÚmonitorenterºÍmonitorexit×Ö½ÚÂëÖ¸ÁîµÄÏêϸÃèÊö£ºhttp://docs.oracle.com/Javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.monitorenter¡£

monitorenter

The objectref must be of type reference.

Each object is associated with a monitor. A monitor is locked if and only if it has an owner. The thread that executes monitorenter attempts to gain ownership of the monitor associated with objectref, as follows:

If the entry count of the monitor associated with objectref is zero, the thread enters the monitor and sets its entry count to one. The thread is then the owner of the monitor.
If the thread already owns the monitor associated with objectref, it reenters the monitor, incrementing its entry count.
If another thread already owns the monitor associated with objectref, the thread blocks until the monitor¡¯s entry count is zero, then tries again to gain ownership.

ÿ¸ö¶ÔÏó¶¼ÓÐÒ»¸öËø£¬Ò²¾ÍÊǼàÊÓÆ÷£¨monitor£©¡£µ±monitor±»Õ¼ÓÐʱ¾Í±íʾËü±»Ëø¶¨¡£Ïß³ÌÖ´ÐÐmonitorenterÖ¸Áîʱ³¢ÊÔ»ñÈ¡¶ÔÏóËù¶ÔÓ¦µÄmonitorµÄËùÓÐȨ£¬¹ý³ÌÈçÏ£º

Èç¹ûmonitorµÄ½øÈëÊýΪ0£¬Ôò¸ÃÏ߳̽øÈëmonitor£¬È»ºó½«½øÈëÊýÉèÖÃΪ1£¬¸ÃÏ̼߳´ÎªmonitorµÄËùÓÐÕß;

Èç¹ûÏß³ÌÒѾ­ÓµÓÐÁ˸Ãmonitor£¬Ö»ÊÇÖØÐ½øÈ룬Ôò½øÈëmonitorµÄ½øÈëÊý¼Ó1;

Èç¹ûÆäËûÏß³ÌÒѾ­Õ¼ÓÃÁËmonitor£¬Ôò¸ÃÏ߳̽øÈë×èÈû״̬£¬Ö±µ½monitorµÄ½øÈëÊýΪ0£¬ÔÙÖØÐ³¢ÊÔ»ñÈ¡monitorµÄËùÓÐȨ¡£

monitorexit

The objectref must be of type reference.

The thread that executes monitorexit must be the owner of the monitor associated with the instance referenced by objectref.

The thread decrements the entry count of the monitor associated with objectref. If as a result the value of the entry count is zero, the thread exits the monitor and is no longer its owner. Other threads that are blocking to enter the monitor are allowed to attempt to do so.

Ö´ÐÐmonitorexitµÄÏ̱߳ØÐëÊÇÏàÓ¦µÄmonitorµÄËùÓÐÕß¡£

Ö¸ÁîÖ´ÐÐʱ£¬monitorµÄ½øÈëÊý¼õ1£¬Èç¹û¼õ1ºó½øÈëÊýΪ0£¬ÄÇÏß³ÌÍ˳ömonitor£¬²»ÔÙÊÇÕâ¸ömonitorµÄËùÓÐÕß¡£ÆäËû±»Õâ¸ömonitor×èÈûµÄÏ߳̿ÉÒÔ³¢ÊÔÈ¥»ñÈ¡Õâ¸ömonitorµÄËùÓÐȨ¡£

ÔÚJDK1.6¼°Æä֮ǰµÄ°æ±¾ÖÐmonitorenterºÍmonitorexit×Ö½ÚÂëÒÀÀµÓڵײãµÄ²Ù×÷ϵͳµÄMutex LockÀ´ÊµÏֵ쬵«ÊÇÓÉÓÚʹÓÃMutex LockÐèÒª½«µ±Ç°Ïß³Ì¹ÒÆð²¢´ÓÓû§Ì¬Çл»µ½ÄÚºË̬À´Ö´ÐУ¬ÕâÖÖÇл»µÄ´ú¼ÛÊǷdz£°º¹óµÄ¡£È»¶øÔÚÏÖʵÖеĴ󲿷ÖÇé¿öÏ£¬Í¬²½·½·¨ÊÇÔËÐÐÔÚµ¥Ï̻߳·¾³£¨ÎÞËø¾ºÕù»·¾³£©¡£Èç¹ûÿ´Î¶¼µ÷ÓÃMutex Lock½«ÑÏÖØµÄÓ°Ïì³ÌÐòµÄÐÔÄÜ¡£Òò´ËÔÚJDK 1.6Ö®ºóµÄ°æ±¾ÖжÔËøµÄʵÏÖ×öÁË´óÁ¿µÄÓÅ»¯£¬ÕâЩÓÅ»¯Ôںܴó³Ì¶ÈÉϼõÉÙ»ò±ÜÃâÁËMutex LockµÄʹÓá£

¶à½ø³ÌµÄ½â¾ö·½°¸

ÔÚ¶àµÀ³ÌÐòϵͳÖдæÔÚÐí¶à½ø³Ì£¬ËüÃǹ²Ïí¸÷ÖÖ×ÊÔ´£¬È»¶øÓкܶà×ÊÔ´Ò»´ÎÖ»Äܹ©Ò»¸ö½ø³ÌʹÓã¬Õâ±ãÊÇÁÙ½ç×ÊÔ´¡£¶à½ø³ÌÖеÄÁÙ½ç×ÊÔ´´óÖÂÉÏ¿ÉÒÔ·ÖΪÁ½À࣬һÀàÊÇÎïÀíÉϵÄÕæÊµ×ÊÔ´£¬Èç´òÓ¡»ú£»Ò»ÀàÊÇÓ²ÅÌ»òÄÚ´æÖеĹ²ÏíÊý¾Ý£¬Èç¹²ÏíÄÚ´æµÈ¡£¶ø½ø³ÌÄÚ»¥³â·ÃÎÊÁÙ½ç×ÊÔ´µÄ´úÂë±»³ÆÎªÁÙ½çÇø¡£

Õë¶ÔÁÙ½ç×ÊÔ´µÄ»¥³â·ÃÎÊ£¬JVM²ãÃæµÄËø¾ÍÒѾ­Ê§È¥Ð§Á¦ÁË¡£ÔÚ¶à½ø³ÌµÄÇé¿öÏ£¬Ö÷Òª»¹ÊÇÀûÓòÙ×÷ϵͳ²ãÃæµÄ½ø³Ì¼äͨÐÅÔ­ÀíÀ´½â¾öÁÙ½ç×ÊÔ´µÄÇÀÕ¼ÎÊÌâ¡£±È½Ï³£¼ûµÄÒ»ÖÖ·½·¨±ãÊÇʹÓÃÐźÅÁ¿£¨Semaphores£©¡£

ÐźÅÁ¿ÔÚPOSIX±ê×¼ÏÂÓÐÁ½ÖÖ£¬·Ö±ðΪÓÐÃûÐźÅÁ¿ºÍÎÞÃûÐźÅÁ¿¡£ÎÞÃûÐźÅÁ¿Í¨³£±£´æÔÚ¹²ÏíÄÚ´æÖУ¬¶øÓÐÃûÐźÅÁ¿ÊÇÓëÒ»¸öÌØ¶¨µÄÎļþÃû³ÆÏà¹ØÁª¡£ÐźÅÁ¿ÊÇÒ»¸öÕûÊý±äÁ¿£¬ÓмÆÊýÐźÅÁ¿ºÍ¶þÖµÐźÅÁ¿Á½ÖÖ¡£¶ÔÐźÅÁ¿µÄ²Ù×÷£¬Ö÷ÒªÊÇP²Ù×÷£¨wait£©ºÍV²Ù×÷£¨signal£©¡£

P²Ù×÷£ºÏȼì²éÐźÅÁ¿µÄ´óС£¬ÈôÖµ´óÓÚÁ㣬Ôò½«ÐźÅÁ¿¼õ1£¬Í¬Ê±½ø³Ì»ñµÃ¹²Ïí×ÊÔ´µÄ·ÃÎÊȨÏÞ£¬¼ÌÐøÖ´ÐУ»ÈôСÓÚ»òÕßµÈÓÚÁ㣬Ôò¸Ã½ø³Ì±»×èÈûºó£¬½øÈëµÈ´ý¶ÓÁС£

V²Ù×÷£º¸Ã²Ù×÷½«ÐźÅÁ¿µÄÖµ¼Ó1£¬Èç¹ûÓнø³Ì×èÈû×ŵȴý¸ÃÐźÅÁ¿£¬ÄÇôÆäÖÐÒ»¸ö½ø³Ì½«±»»½ÐÑ¡£

¾Ù¸öÀý×Ó£¬ÉèÐźÅÁ¿Îª1£¬µ±Ò»¸ö½ø³ÌAÔÚ½øÈëÁÙ½çÇøÖ®Ç°£¬ÏȽøÐÐP²Ù×÷¡£·¢ÏÖÖµ´óÓÚÁ㣬ÄÇô¾Í½«ÐźÅÁ¿¼õΪ0£¬½øÈëÁÙ½çÇøÖ´ÐС£´Ëʱ£¬ÈôÁíÒ»¸ö½ø³ÌBÒ²Òª½øÈ¥ÁÙ½çÇø£¬½øÐÐP²Ù×÷£¬·¢ÏÖÐźÅÁ¿µÈÓÚ0£¬Ôò»á±»×èÈû¡£µ±½ø³ÌAÍ˳öÁÙ½çÇøÊ±£¬»á½øÐÐV²Ù×÷£¬½«ÐźÅÁ¿µÄÖµ¼Ó1£¬²¢»½ÐÑ×èÈûµÄ½ø³ÌB¡£´ËʱB¾Í¿ÉÒÔ½øÈëÁÙ½çÇøÁË¡£

ÕâÖÖ·½Ê½£¬ÆäʵºÍ¶àÏ̻߳·¾³ÏµļӽâËø·Ç³£ÀàËÆ¡£Òò´ËÓÃÐźÅÁ¿´¦ÀíÁÙ½ç×ÊÔ´ÇÀÕ¼£¬Ò²¿ÉÒÔ¼òµ¥µØÀí½âΪ¶ÔÁÙ½çÇø½øÐмÓËø¡£

ͨ¹ýÉÏÃæµÄһЩÁ˽⣬ÎÒÃÇ¿ÉÒÔ¸ÅÀ¨³ö½â¾ö»¥³âÐÔÎÊÌ⣬¼´×ÊÔ´ÇÀÕ¼µÄ»ù±¾·½Ê½Îª£º

¶Ô¹²Ïí×ÊÔ´µÄ²Ù×÷ǰºó£¨½øÈëÍ˳öÁÙ½çÇø£©¼Ó½âËø£¬±£Ö¤²»Í¬Ï̻߳ò½ø³Ì¿ÉÒÔ»¥³âÓÐÐòµÄ²Ù×÷×ÊÔ´¡£

¼Ó½âËø·½Ê½£¬ÓÐÏÔʽµÄ¼Ó½âËø£¬ÈçReentrantLock»òÐźÅÁ¿£»Ò²ÓÐÒþʽµÄ¼Ó½âËø£¬Èçsynchronized¡£ÄÇôÔÚ·Ö²¼Ê½»·¾³ÖУ¬ÎªÁ˱£Ö¤²»Í¬JVM²»Í¬Ö÷»ú¼ä²»»á³öÏÖ×ÊÔ´ÇÀÕ¼£¬ÄÇôͬÑùÖ»Òª¶ÔÁÙ½çÇø¼Ó½âËø¾Í¿ÉÒÔÁË¡£

È»¶øÔÚ¶àÏß³ÌºÍ¶à½ø³ÌÖУ¬ËøÒѾ­ÓбȽÏÍêÉÆµÄʵÏÖ£¬Ö±½ÓʹÓü´¿É¡£µ«ÊÇÔÚ·Ö²¼Ê½»·¾³Ï£¬¾ÍÐèÒªÎÒÃÇ×Ô¼ºÀ´ÊµÏÖ·Ö²¼Ê½Ëø¡£

·Ö²¼Ê½»·¾³ÏµĽâ¾ö·½°¸¡ª¡ª·Ö²¼Ê½Ëø

Ê×ÏÈ£¬ÎÒÃÇÀ´¿´¿´·Ö²¼Ê½ËøµÄ»ù±¾Ìõ¼þ¡£

·Ö²¼Ê½ËøÌõ¼þ

»ù±¾Ìõ¼þ

ÔٻعË϶àÏß³ÌºÍ¶à½ø³Ì»·¾³ÏµÄËø£¬¿ÉÒÔ·¢ÏÖËøµÄʵÏÖÓкܶ๲֮ͨ´¦£¬ËüÃǶ¼ÐèÒªÂú×ãһЩ×î»ù±¾µÄÌõ¼þ£º

ÐèÒªÓÐ´æ´¢ËøµÄ¿Õ¼ä£¬²¢ÇÒËøµÄ¿Õ¼äÊÇ¿ÉÒÔ·ÃÎʵ½µÄ¡£

ËøÐèÒª±»Î¨Ò»±êʶ¡£

ËøÒªÓÐÖÁÉÙÁ½ÖÖ״̬¡£

×Ðϸ·ÖÎöÕâÈý¸öÌõ¼þ£º

´æ´¢¿Õ¼ä

ËøÊÇÒ»¸ö³éÏóµÄ¸ÅÄî£¬ËøµÄʵÏÖ£¬ÐèÒªÒÀ´æÓÚÒ»¸ö¿ÉÒÔ´æ´¢ËøµÄ¿Õ¼ä¡£ÔÚ¶àÏß³ÌÖÐÊÇÄڴ棬ÔÚ¶à½ø³ÌÖÐÊÇÄÚ´æ»òÕß´ÅÅÌ¡£¸üÖØÒªµÄÊÇ£¬Õâ¸ö¿Õ¼äÊÇ¿ÉÒÔ±»·ÃÎʵ½µÄ¡£¶àÏß³ÌÖУ¬²»Í¬µÄÏ̶߳¼¿ÉÒÔ·ÃÎʵ½¶ÑÖеijÉÔ±±äÁ¿£»ÔÚ¶à½ø³ÌÖУ¬²»Í¬µÄ½ø³Ì¿ÉÒÔ·ÃÎʵ½¹²ÏíÄÚ´æÖеÄÊý¾Ý»òÕß´æ´¢ÔÚ´ÅÅÌÖеÄÎļþ¡£µ«ÊÇÔÚ·Ö²¼Ê½»·¾³ÖУ¬²»Í¬µÄÖ÷»úºÜÄÑ·ÃÎʶԷ½µÄÄÚ´æ»ò´ÅÅÌ¡£Õâ¾ÍÐèÒªÒ»¸ö¶¼ÄÜ·ÃÎʵ½µÄÍⲿ¿Õ¼äÀ´×÷Ϊ´æ´¢¿Õ¼ä¡£

×îÆÕ±éµÄÍⲿ´æ´¢¿Õ¼ä¾ÍÊÇÊý¾Ý¿âÁË£¬ÊÂʵÉÏҲȷʵÓлùÓÚÊý¾Ý¿â×ö·Ö²¼Ê½Ëø£¨ÐÐËø¡¢versionÀÖ¹ÛËø£©£¬Èçquartz¼¯Èº¼Ü¹¹ÖоÍÓÐËùʹÓᣳý´ËÒÔÍ⣬»¹Óи÷ʽ»º´æÈçRedis¡¢Tair¡¢Memcached¡¢Mongodb£¬µ±È»»¹ÓÐרÃŵķֲ¼Ê½Ð­µ÷·þÎñZookeeper£¬ÉõÖÁÊÇÁíһ̨Ö÷»ú¡£Ö»Òª¿ÉÒÔ´æ´¢Êý¾Ý¡¢ËøÔÚÆäÖпÉÒÔ±»¶àÖ÷»ú·ÃÎʵ½£¬ÄǾͿÉÒÔ×÷Ϊ·Ö²¼Ê½ËøµÄ´æ´¢¿Õ¼ä¡£

Ψһ±êʶ

²»Í¬µÄ¹²Ïí×ÊÔ´£¬±ØÈ»ÐèÒªÓò»Í¬µÄËø½øÐб£»¤£¬Òò´ËÏàÓ¦µÄËø±ØÐëÓÐΨһµÄ±êʶ¡£ÔÚ¶àÏ̻߳·¾³ÖУ¬Ëø¿ÉÒÔÊÇÒ»¸ö¶ÔÏó£¬ÄÇô¶ÔÕâ¸ö¶ÔÏóµÄÒýÓñãÊÇÕâ¸öΨһ±êʶ¡£¶à½ø³Ì»·¾³ÖУ¬ÐźÅÁ¿ÔÚ¹²ÏíÄÚ´æÖÐÒ²ÊÇÓÉÒýÓÃÀ´×÷ΪΨһµÄ±êʶ¡£µ«ÊÇÈç¹û²»ÔÚÄÚ´æÖУ¬Ê§È¥Á˶ÔËøµÄÒýÓã¬ÈçºÎΨһ±êʶËüÄØ£¿ÉÏÎÄÌáµ½µÄÓÐÃûÐźÅÁ¿£¬±ãÊÇÓÃÓ²ÅÌÖеÄÎļþÃû×÷ΪΨһ±êʶ¡£Òò´Ë£¬ÔÚ·Ö²¼Ê½»·¾³ÖУ¬Ö»Òª¸øÕâ¸öËøÉ趨һ¸öÃû³Æ£¬²¢ÇÒ±£Ö¤Õâ¸öÃû³ÆÊÇÈ«¾ÖΨһµÄ£¬ÄÇô¾Í¿ÉÒÔ×÷ΪΨһ±êʶ¡£

ÖÁÉÙÁ½ÖÖ״̬

ΪÁ˸øÁÙ½çÇø¼ÓËøºÍ½âËø£¬ÐèÒª´æ´¢Á½ÖÖ²»Í¬µÄ״̬¡£ÈçReentrantLockÖеÄstatus£¬0±íʾûÓÐÏ߳̾ºÕù£¬´óÓÚ0±íʾÓÐÏ߳̾ºÕù£»ÐźÅÁ¿´óÓÚ0±íʾ¿ÉÒÔ½øÈëÁÙ½çÇø£¬Ð¡ÓÚµÈÓÚ0Ôò±íʾÐèÒª±»×èÈû¡£Òò´ËÖ»ÒªÔÚ·Ö²¼Ê½»·¾³ÖУ¬ËøµÄ״̬ÓÐÁ½ÖÖ»òÒÔÉÏ£ºÈçÓÐËø¡¢Ã»Ëø£»´æÔÚ¡¢²»´æÔڵȣ¬¾ù¿ÉÒÔʵÏÖ¡£

ÓÐÁËÕâÈý¸öÌõ¼þ£¬»ù±¾¾Í¿ÉÒÔʵÏÖÒ»¸ö¼òµ¥µÄ·Ö²¼Ê½ËøÁË¡£ÏÂÃæÒÔÊý¾Ý¿âΪÀý£¬ÊµÏÖÒ»¸ö¼òµ¥µÄ·Ö²¼Ê½Ëø£º

Êý¾Ý¿â±í£¬×Ö¶ÎÎªËøµÄID£¨Î¨Ò»±êʶ£©£¬ËøµÄ״̬£¨0±íʾûÓб»Ëø£¬1±íʾ±»Ëø£©¡£

α´úÂëΪ£º

lock = mysql.get(id);
while(lock.status == 1) {
sleep(100);
}
mysql.update(lock.status = 1);
doSomething();
mysql.update(lock.status = 0);

ÎÊÌâ

ÒÔÉϵķ½Ê½¼´¿ÉÒÔʵÏÖÒ»¸ö´Ö²ÚµÄ·Ö²¼Ê½Ëø£¬µ«ÊÇÕâÑùµÄʵÏÖ£¬ÓÐûÓÐʲôÎÊÌâÄØ£¿

ÎÊÌâ1£ºËø×´Ì¬ÅжÏÔ­×ÓÐÔÎÞ·¨±£Ö¤

´Ó¶ÁÈ¡ËøµÄ״̬£¬µ½ÅжϸÃ״̬ÊÇ·ñΪ±»Ëø£¬ÐèÒª¾­ÀúÁ½²½²Ù×÷¡£Èç¹û²»Äܱ£Ö¤ÕâÁ½²½µÄÔ­×ÓÐÔ£¬¾Í¿ÉÄܵ¼Ö²»Ö¹Ò»¸öÇëÇó»ñÈ¡µ½ÁËËø£¬ÕâÏÔÈ»ÊDz»Ðеġ£Òò´Ë£¬ÎÒÃÇÐèÒª±£Ö¤Ëø×´Ì¬ÅжϵÄÔ­×ÓÐÔ¡£

ÎÊÌâ2£ºÍøÂç¶Ï¿ª»òÖ÷»úå´»ú£¬Ëø×´Ì¬ÎÞ·¨Çå³ý

¼ÙÉèÔÚÖ÷»úÒѾ­»ñÈ¡µ½ËøµÄÇé¿öÏ£¬Í»È»³öÏÖÁËÍøÂç¶Ï¿ª»òÕßÖ÷»úå´»ú£¬Èç¹û²»×öÈκδ¦Àí¸ÃËø½«ÈÔÈ»´¦ÓÚ±»Ëø¶¨µÄ״̬¡£ÄÇô֮ºóËùÓеÄÇëÇó¶¼ÎÞ·¨Ôٳɹ¦ÇÀÕ¼µ½Õâ¸öËø¡£Òò´Ë£¬ÎÒÃÇÐèÒªÔÚ³ÖÓÐËøµÄÖ÷»úå´»ú»òÕßÍøÂç¶Ï¿ªµÄʱºò£¬¼°Ê±µÄÊͷŵôÕâ°ÑËø¡£

ÎÊÌâ3£ºÎÞ·¨±£Ö¤ÊͷŵÄÊÇ×Ô¼ºÉÏËøµÄÄǰÑËø

ÔÚ½â¾öÁËÎÊÌâ2µÄÇé¿öÏÂÔÙÉèÏëһϣ¬¼ÙÉè³ÖÓÐËøµÄÖ÷»úAÔÚÁÙ½çÇøÓöµ½ÍøÂç¶¶¶¯µ¼ÖÂÍøÂç¶Ï¿ª£¬·Ö²¼Ê½Ëø¼°Ê±µÄÊͷŵôÁËÕâ°ÑËø¡£Ö®ºó£¬ÁíÒ»¸öÖ÷»úBÕ¼ÓÐÁËÕâ°ÑËø£¬µ«ÊÇ´ËʱÖ÷»úAÍøÂç»Ö¸´£¬Í˳öÁÙ½çÇøÊ±½âËø¡£ÓÉÓÚ¶¼ÊÇͬһ°ÑËø£¬ËùÒÔA¾Í»á½«BµÄËø½â¿ª¡£´ËʱÈç¹ûÓеÚÈý¸öÖ÷»ú³¢ÊÔÇÀÕ¼Õâ°ÑËø£¬Ò²½«»á³É¹¦»ñµÃ¡£Òò´Ë£¬ÎÒÃÇÐèÒªÔÚ½âËøÊ±£¬È·¶¨×Ô¼º½âµÄÕâ¸öËøÕýÊÇ×Ô¼ºËøÉϵġ£

½ø½×Ìõ¼þ

Èç¹û·Ö²¼Ê½ËøµÄʵÏÖ£¬»¹ÄÜÔÙ½â¾öÉÏÃæµÄÈý¸öÎÊÌ⣬ÄÇô¾Í¿ÉÒÔËãÊÇÒ»¸öÏà¶ÔÍêÕûµÄ·Ö²¼Ê½ËøÁË¡£È»¶ø£¬ÔÚʵ¼ÊµÄϵͳ»·¾³ÖУ¬»¹»á¶Ô·Ö²¼Ê½ËøÓиü¸ß¼¶µÄÒªÇó¡£

¿ÉÖØÈ룺Ïß³ÌÖеĿÉÖØÈ룬ָµÄÊÇÍâ²ãº¯Êý»ñµÃËøÖ®ºó£¬ÄÚ²ãÒ²¿ÉÒÔ»ñµÃËø£¬ReentrantLockºÍsynchronized¶¼ÊÇ¿ÉÖØÈëËø£»ÑÜÉúµ½·Ö²¼Ê½»·¾³ÖУ¬Ò»°ãÈÔȻָµÄÊÇÏ̵߳ĿÉÖØÈ룬ÔÚ¾ø´ó¶àÊý·Ö²¼Ê½»·¾³ÖУ¬¶¼ÒªÇó·Ö²¼Ê½ËøÊÇ¿ÉÖØÈëµÄ¡£

¾ªÈºÐ§Ó¦£¨Herd Effect£©£ºÔÚ·Ö²¼Ê½ËøÖУ¬¾ªÈºÐ§Ó¦Ö¸µÄÊÇ£¬ÔÚÓжà¸öÇëÇóµÈ´ý»ñÈ¡ËøµÄʱºò£¬Ò»µ©Õ¼ÓÐËøµÄÏß³ÌÊÍ·ÅÖ®ºó£¬Èç¹ûËùÓеȴýµÄ·½¶¼Í¬Ê±±»»½ÐÑ£¬³¢ÊÔÇÀÕ¼Ëø¡£µ«ÊÇÕâÑùµÄÇé¿ö»áÔì³É±È½Ï´óµÄ¿ªÏú£¬ÄÇôÔÚʵÏÖ·Ö²¼Ê½ËøµÄʱºò£¬Ó¦¸Ã¾¡Á¿±ÜÃ⾪ȺЧӦµÄ²úÉú¡£

¹«Æ½ËøºÍ·Ç¹«Æ½Ëø£º²»Í¬µÄÐèÇ󣬿ÉÄÜÐèÒª²»Í¬µÄ·Ö²¼Ê½Ëø¡£·Ç¹«Æ½ËøÆÕ±é±È¹«Æ½Ëø¿ªÏúС¡£µ«ÊÇÒµÎñÐèÇóÈç¹û±ØÐëÒªËøµÄ¾ºÕùÕß°´Ë³Ðò»ñµÃËø£¬ÄÇô¾ÍÐèҪʵÏÖ¹«Æ½Ëø¡£

×èÈûËøºÍ×ÔÐýËø£ºÕë¶Ô²»Í¬µÄʹÓó¡¾°£¬×èÈûËøºÍ×ÔÐýËøµÄЧÂÊÒ²»áÓÐËù²»Í¬¡£×èÈûËø»áÓÐÉÏÏÂÎÄÇл»£¬Èç¹û²¢·¢Á¿±È½Ï¸ßÇÒÁÙ½çÇøµÄ²Ù×÷ºÄʱ±È½Ï¶Ì£¬ÄÇôÔì³ÉµÄÐÔÄÜ¿ªÏú¾Í±È½Ï´óÁË¡£µ«ÊÇÈç¹ûÁÙ½çÇø²Ù×÷ºÄʱ±È½Ï³¤£¬Ò»Ö±±£³Ö×ÔÐý£¬Ò²»á¶ÔCPUÔì³É¸ü´óµÄ¸ººÉ¡£

±£ÁôÒÔÉÏËùÓÐÎÊÌâºÍÌõ¼þ£¬ÎÒÃǽÓÏÂÀ´¿´Ò»Ð©±È½ÏµäÐ͵ÄʵÏÖ·½°¸¡£

µäÐÍʵÏÖ

ZooKeeperµÄʵÏÖ

ZooKeeper£¨ÒÔϼò³Æ¡°ZK¡±£©ÖÐÓÐÒ»ÖÖ½Úµã½Ð×ö˳Ðò½Úµã£¬¼ÙÈçÎÒÃÇÔÚ/lock/Ŀ¼Ï´´½¨3¸ö½Úµã£¬ZK¼¯Èº»á°´ÕÕ·¢Æð´´½¨µÄ˳ÐòÀ´´´½¨½Úµã£¬½Úµã·Ö±ðΪ/lock/0000000001¡¢/lock/0000000002¡¢/lock/0000000003¡£

ZKÖл¹ÓÐÒ»ÖÖÃûΪÁÙʱ½ÚµãµÄ½Úµã£¬ÁÙʱ½ÚµãÓÉij¸ö¿Í»§¶Ë´´½¨£¬µ±¿Í»§¶ËÓëZK¼¯Èº¶Ï¿ªÁ¬½Ó£¬Ôò¸Ã½Úµã×Ô¶¯±»É¾³ý¡£EPHEMERAL_SEQUENTIALΪÁÙʱ˳Ðò½Úµã¡£

¸ù¾ÝZKÖнڵãÊÇ·ñ´æÔÚ£¬¿ÉÒÔ×÷Ϊ·Ö²¼Ê½ËøµÄËø×´Ì¬£¬ÒÔ´ËÀ´ÊµÏÖÒ»¸ö·Ö²¼Ê½Ëø£¬ÏÂÃæÊÇ·Ö²¼Ê½ËøµÄ»ù±¾Âß¼­£º

¿Í»§¶Ëµ÷ÓÃcreate()·½·¨´´½¨ÃûΪ¡°/dlm-locks/lockname/lock-¡±µÄÁÙʱ˳Ðò½Úµã¡£

¿Í»§¶Ëµ÷ÓÃgetChildren(¡°lockname¡±)·½·¨À´»ñÈ¡ËùÓÐÒѾ­´´½¨µÄ×ӽڵ㡣

¿Í»§¶Ë»ñÈ¡µ½ËùÓÐ×Ó½ÚµãpathÖ®ºó£¬Èç¹û·¢ÏÖ×Ô¼ºÔÚ²½Öè1Öд´½¨µÄ½ÚµãÊÇËùÓнڵãÖÐÐòºÅ×îСµÄ£¬ÄÇô¾ÍÈÏΪÕâ¸ö¿Í»§¶Ë»ñµÃÁËËø¡£

Èç¹û´´½¨µÄ½Úµã²»ÊÇËùÓнڵãÖÐÐèÒª×îСµÄ£¬ÄÇôÔò¼àÊÓ±È×Ô¼º´´½¨½ÚµãµÄÐòÁкÅСµÄ×î´óµÄ½Úµã£¬½øÈëµÈ´ý¡£Ö±µ½Ï´μàÊÓµÄ×Ó½Úµã±ä¸üµÄʱºò£¬ÔÙ½øÐÐ×Ó½ÚµãµÄ»ñÈ¡£¬ÅжÏÊÇ·ñ»ñÈ¡Ëø¡£

ÊÍ·ÅËøµÄ¹ý³ÌÏà¶Ô±È½Ï¼òµ¥£¬¾ÍÊÇɾ³ý×Ô¼º´´½¨µÄÄǸö×ӽڵ㼴¿É£¬²»¹ýÒ²ÈÔÐèÒª¿¼ÂÇɾ³ý½Úµãʧ°ÜµÈÒì³£Çé¿ö¡£

¿ªÔ´µÄ»ùÓÚZKµÄMenagerieµÄÔ´Âë¾ÍÊÇÒ»¸öµäÐ͵ÄÀý×Ó£ºhttps://github.com/sfines/menagerie ¡£

MenagerieÖеÄlockÊ×ÏÈʵÏÖÁË¿ÉÖØÈëËø£¬ÀûÓÃThreadLocal´æ´¢½øÈëµÄ´ÎÊý£¬Ã¿´Î¼ÓËø´ÎÊý¼Ó1£¬Ã¿´Î½âËø´ÎÊý¼õ1¡£Èç¹ûÅжϳöÊǵ±Ç°Ï̳߳ÖÓÐËø£¬¾Í²»ÓÃ×ß»ñÈ¡ËøµÄÁ÷³Ì¡£

ͨ¹ýtryAcquireDistributed·½·¨³¢ÊÔ»ñÈ¡Ëø£¬Ñ­»·ÅжÏǰÐò½ÚµãÊÇ·ñ´æÔÚ£¬Èç¹û´æÔÚÔò¼àÊӸýڵ㲢ÇÒ·µ»Ø»ñȡʧ°Ü¡£Èç¹ûǰÐò½Úµã²»´æÔÚ£¬ÔòÔÙÅжϸüǰһ¸ö½Úµã¡£Èç¹ûÅжϳö×Ô¼ºÊǵÚÒ»¸ö½Úµã£¬Ôò·µ»Ø»ñÈ¡³É¹¦¡£

ΪÁËÔÚ±ðµÄÏß³ÌÕ¼ÓÐËøµÄʱºò×èÈû£¬´úÂëÖÐʹÓÃJUCµÄconditionÀ´Íê³É¡£Èç¹û»ñÈ¡³¢ÊÔËøÊ§°Ü£¬Ôò½øÈëµÈ´ýÇÒ·ÅÆúlocalLock£¬µÈ´ýǰÐò½Úµã»½ÐÑ¡£¶ølocalLockÊÇÒ»¸ö±¾µØµÄ¹«Æ½Ëø£¬Ê¹µÃcondition¿ÉÒÔ¹«Æ½µÄ½øÐл½ÐÑ£¬ÅäºÏÑ­»·ÅжÏǰÐò½Úµã£¬ÊµÏÖÁËÒ»¸ö¹«Æ½Ëø¡£

ÕâÖÖʵÏÖ·½Ê½·Ç³£ÀàËÆÓÚReentrantLockµÄCHL¶ÓÁУ¬¶øÇÒzkµÄÁÙʱ½Úµã¿ÉÒÔÖ±½Ó±ÜÃâÍøÂç¶Ï¿ª»òÖ÷»úå´»ú£¬Ëø×´Ì¬ÎÞ·¨Çå³ýµÄÎÊÌ⣬˳Ðò½Úµã¿ÉÒÔ±ÜÃ⾪ȺЧӦ¡£ÕâÐ©ÌØÐÔ¶¼Ê¹µÃÀûÓÃZKʵÏÖ·Ö²¼Ê½Ëø³ÉΪÁË×îÆÕ±éµÄ·½°¸Ö®Ò»¡£

RedisµÄʵÏÖ

RedisµÄ·Ö²¼Ê½»º´æÌØÐÔʹÆä³ÉΪÁË·Ö²¼Ê½ËøµÄÒ»ÖÖ»ù´¡ÊµÏÖ¡£Í¨¹ýRedisÖÐÊÇ·ñ´æÔÚij¸öËøID£¬Ôò¿ÉÒÔÅжÏÊÇ·ñÉÏËø¡£ÎªÁ˱£Ö¤ÅжÏËøÊÇ·ñ´æÔÚµÄÔ­×ÓÐÔ£¬±£Ö¤Ö»ÓÐÒ»¸öÏ̻߳ñȡͬһ°ÑËø£¬RedisÓÐSETNX£¨¼´SET if Not

eXists£©ºÍGETSET£¨ÏÈдÐÂÖµ£¬·µ»Ø¾ÉÖµ£¬Ô­×ÓÐÔ²Ù×÷£¬¿ÉÒÔÓÃÓÚ·Ö±æÊDz»ÊÇÊ״βÙ×÷£©²Ù×÷¡£

ΪÁË·ÀÖ¹Ö÷»úå´»ú»òÍøÂç¶Ï¿ªÖ®ºóµÄËÀËø£¬RedisûÓÐZKÄÇÖÖÌìÈ»µÄʵÏÖ·½Ê½£¬Ö»ÄÜÒÀÀµÉèÖó¬Ê±Ê±¼äÀ´¹æ±Ü¡£

ÒÔÏÂÊÇÒ»ÖÖ±È½ÏÆÕ±éµ«²»Ì«ÍêÉÆµÄRedis·Ö²¼Ê½ËøµÄʵÏÖ²½Ö裨ÓëÏÂͼһһ¶ÔÓ¦£©£º

1.Ïß³ÌA·¢ËÍSETNX lock.orderid³¢ÊÔ»ñµÃËø£¬Èç¹ûËø²»´æÔÚ£¬Ôòset²¢»ñµÃËø¡£

2.Èç¹ûËø´æÔÚ£¬ÔòÔÙÅжÏËøµÄÖµ£¨Ê±¼ä´Á£©ÊÇ·ñ´óÓÚµ±Ç°Ê±¼ä£¬Èç¹ûûÓг¬Ê±£¬ÔòµÈ´ýÒ»ÏÂÔÙÖØÊÔ¡£

3.Èç¹ûÒѾ­³¬Ê±ÁË£¬ÔÚÓÃGETSET lock.{orderid}À´³¢ÊÔ»ñÈ¡Ëø£¬Èç¹ûÕâʱºòÄõ½µÄʱ¼ä´ÁÈԾɳ¬Ê±£¬Ôò˵Ã÷ÒѾ­»ñµÃËøÁË¡£

4.Èç¹ûÔÚ´Ë֮ǰ£¬ÁíÒ»¸öÏß³ÌC¿ìÒ»²½Ö´ÐÐÁËÉÏÃæµÄ²Ù×÷£¬ÄÇôAÄõ½µÄʱ¼ä´ÁÊǸöδ³¬Ê±µÄÖµ£¬ÕâʱAûÓÐÈçÆÚ»ñµÃËø£¬ÐèÒªÔٴεȴý»òÖØÊÔ¡£

¸ÃʵÏÖ»¹ÓÐÒ»¸öÐèÒª¿¼ÂǵÄÎÊÌâÊÇÈ«¾ÖʱÖÓÎÊÌ⣬ÓÉÓÚÉú²ú»·¾³Ö÷»úʱÖÓ²»Äܱ£Ö¤Íêȫͬ²½£¬¶Ôʱ¼ä´ÁµÄÅжÏÒ²¿ÉÄÜ»á²úÉúÎó²î¡£

ÒÔÉÏÊÇRedisµÄÒ»ÖÖ³£¼ûµÄʵÏÖ·½Ê½£¬³ý´ËÒÔÍ⻹¿ÉÒÔÓÃSETNX+EXPIREÀ´ÊµÏÖ¡£RedissonÊÇÒ»¸ö¹Ù·½ÍƼöµÄRedis¿Í»§¶Ë²¢ÇÒʵÏÖÁ˺ܶà·Ö²¼Ê½µÄ¹¦ÄÜ¡£ËüµÄ·Ö²¼Ê½Ëø¾ÍÌṩÁËÒ»ÖÖ¸üÍêÉÆµÄ½â¾ö·½°¸£¬Ô´Â룺https://github.com/mrniko/redisson¡£

TairµÄʵÏÖ

TairºÍRedisµÄʵÏÖÀàËÆ£¬Tair¿Í»§¶Ë·â×°ÁËÒ»¸öexpireLockµÄ·½·¨£ºÍ¨¹ýËø×´Ì¬ºÍ¹ýÆÚʱ¼ä´ÁÀ´¹²Í¬ÅжÏËøÊÇ·ñ´æÔÚ£¬Ö»ÓÐËøÒѾ­´æÔÚÇÒûÓйýÆÚµÄ״̬²ÅÅж¨ÎªÓÐËø×´Ì¬¡£ÔÚÓÐËø×´Ì¬Ï£¬²»ÄܼÓËø£¬ÄÜͨ¹ý´óÓÚ»òµÈÓÚ¹ýÆÚʱ¼äµÄʱ¼ä´Á½øÐнâËø¡£

²ÉÓÃÕâÑùµÄ·½Ê½£¬¿ÉÒÔ²»ÓÃÔÚValueÖд洢ʱ¼ä´Á£¬²¢ÇÒ±£Ö¤ÁËÅжÏÊÇ·ñÓÐËøµÄÔ­×ÓÐÔ¡£¸üÖµµÃ×¢ÒâµÄÊÇ£¬ÓÉÓÚ³¬Ê±Ê±¼äÊÇÓÉTairÅжϣ¬ËùÒÔ±ÜÃâÁ˲»Í¬Ö÷»úʱÖÓ²»Ò»ÖµÄÇé¿ö¡£

ÒÔÉϵļ¸ÖÖ·Ö²¼Ê½ËøÊµÏÖ·½Ê½£¬¶¼ÊDZȽϳ£¼ûÇÒÓÐЩÒѾ­ÔÚÉú²ú»·¾³ÖÐÓ¦Óá£Ëæ×ÅÓ¦Óû·¾³Ô½À´Ô½¸´ÔÓ£¬ÕâЩʵÏÖ¿ÉÄÜÈÔÈ»»áÓöµ½Ò»Ð©ÌôÕ½¡£

Ç¿ÒÀÀµÓÚÍⲿ×é¼þ£º·Ö²¼Ê½ËøµÄʵÏÖ¶¼ÐèÒªÒÀÀµÓÚÍⲿÊý¾Ý´æ´¢ÈçZK¡¢RedisµÈ£¬Òò´ËÒ»µ©ÕâЩÍⲿ×é¼þ³öÏÖ¹ÊÕÏ£¬ÄÇô·Ö²¼Ê½Ëø¾Í²»¿ÉÓÃÁË¡£

ÎÞ·¨ÍêÈ«Âú×ãÐèÇ󣺲»Í¬·Ö²¼Ê½ËøµÄʵÏÖ£¬¶¼ÓÐÏàÓ¦µÄÌØµã£¬¶ÔÓÚһЩÐèÇó²¢²»ÄܺܺõÄÂú×㣬ÈçʵÏÖ¹«Æ½Ëø¡¢¸øµÈ´ýËø¼Ó³¬Ê±Ê±¼äµÈ¡£

»ùÓÚÒÔÉÏÎÊÌ⣬½áºÏ¶àÖÖʵÏÖ·½Ê½£¬ÎÒÃÇ¿ª·¢ÁËCerberus£¨µÃÃû×ÔÏ£À°Éñ»°ÀïÊØÎÀµØÓüµÄÃÍÈ®£©£¬ÖÂÁ¦ÓÚÌṩÁé»î¿É¿¿µÄ·Ö²¼Ê½Ëø¡£

Cerberus·Ö²¼Ê½Ëø

CerberusÓÐÒÔϼ¸¸öÌØµã¡£

ÌØµãÒ»£ºÒ»Ì×½Ó¿Ú¶àÖÖÒýÇæ

Cerberus·Ö²¼Ê½ËøÊ¹ÓÃÁ˶àÖÖÒýÇæÊµÏÖ·½Ê½£¨Tair¡¢ZK¡¢Î´À´Ö§³ÖRedis£©£¬Ö§³ÖʹÓ÷½×ÔÖ÷Ñ¡ÔñËùÐèµÄÒ»ÖÖ»ò¶àÖÖÒýÇæ¡£ÕâÑù¿ÉÒÔ½áºÏÒýÇæÌØµã£¬Ñ¡Ôñ·ûºÏʵ¼ÊÒµÎñÐèÇóºÍϵͳ¼Ü¹¹µÄ·½Ê½¡£

Cerberus·Ö²¼Ê½Ëø½«²»Í¬ÒýÇæµÄ½Ó¿Ú³éÏóΪһÌ×£¬ÆÁ±ÎÁ˲»Í¬ÒýÇæµÄʵÏÖϸ½Ú¡£Ê¹µÃʹÓ÷½¿ÉÒÔרעÓÚÒµÎñÂß¼­£¬Ò²¿ÉÒÔÈÎÒâÑ¡Ôñ²¢Çл»ÒýÇæ¶ø²»±Ø¸ü¸ÄÈκεÄÒµÎñ´úÂë¡£

Èç¹ûʹÓ÷½Ñ¡ÔñÁËÒ»ÖÖÒÔÉϵÄÒýÇæ£¬ÄÇôÒÔÅäÖÃ˳ÐòÀ´Çø·ÖÖ÷¸±ÒýÇæ¡£ÒÔÏÂÊÇʹÓÃÖ÷ÒýÇæµÄÍÆ¼ö£º

ÌØµã¶þ£ºÊ¹ÓÃÁé»î¡¢Ñ§Ï°³É±¾µÍ

ÏÂÃæÊÇCerberusµÄlock·½·¨£¬ÕâЩ·½·¨ºÍJUCµÄReentrantLockµÄ·½Ê½±£³ÖÒ»Ö£¬Ê¹Ó÷dz£Áé»îÇÒ²»ÐèÒª¶îÍâµÄѧϰʱ¼ä¡£

void lock();

»ñÈ¡Ëø£¬Èç¹ûËø±»Õ¼Ó㬽«½ûÓõ±Ç°Ị̈߳¬²¢ÇÒÔÚ»ñµÃËøÖ®Ç°£¬¸ÃÏ߳̽«Ò»Ö±´¦ÓÚ×èÈû״̬¡£

boolean tryLock();

½öÔÚµ÷ÓÃÊ±ËøÎª¿ÕÏÐ״̬²Å»ñÈ¡¸ÃËø¡£

Èç¹ûËø¿ÉÓã¬Ôò»ñÈ¡Ëø£¬²¢Á¢¼´·µ»ØÖµtrue¡£Èç¹ûËø²»¿ÉÓã¬Ôò´Ë·½·¨½«Á¢¼´·µ»ØÖµfalse¡£

boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

Èç¹ûËøÔÚ¸ø¶¨µÄµÈ´ýʱ¼äÄÚ¿ÕÏУ¬²¢ÇÒµ±Ç°Ïß³Ìδ±»Öжϣ¬Ôò»ñÈ¡Ëø¡£

Èç¹ûÔÚ¸ø¶¨Ê±¼äÄÚËø¿ÉÓã¬Ôò»ñÈ¡Ëø£¬²¢Á¢¼´·µ»ØÖµtrue¡£Èç¹ûÔÚ¸ø¶¨Ê±¼äÄÚËøÒ»Ö±²»¿ÉÓã¬Ôò´Ë·½·¨½«Á¢¼´·µ»ØÖµfalse¡£

void lockInterruptibly() throws InterruptedException;

»ñÈ¡Ëø£¬Èç¹ûËø±»Õ¼Óã¬ÔòÒ»Ö±µÈ´ýÖ±µ½Ï̱߳»ÖжϻòÕß»ñÈ¡µ½Ëø¡£

void unlock();

Êͷŵ±Ç°³ÖÓеÄËø¡£

ÌØµãÈý£ºÖ§³ÖÒ»¼ü½µ¼¶

CerberusÌṩÁËʵʱÇл»ÒýÇæµÄ½Ó¿Ú:

String switchEngine()

ת»»·Ö²¼Ê½ËøÒýÇæ£¬°´ÅäÖõÄÒýÇæµÄ˳ÐòÑ­»·×ª»»¡£

·µ»ØÖµ£º·µ»Øµ±Ç°µÄengineÃû×Ö£¬È磺¡±zk¡±¡£

String switchEngine(String engineName)

ת»»·Ö²¼Ê½ËøÒýÇæ£¬Çл»ÎªÖ¸¶¨µÄÒýÇæ¡£

²ÎÊý£ºengineName - ÒýÇæµÄÃû×Ö£¬Í¬ÅäÖÃbeanµÄÃû×Ö£¬¡±zk¡±/¡±tair¡±¡£

·µ»ØÖµ£º·µ»Øµ±Ç°µÄengineÃû×Ö£¬È磺¡±zk¡±¡£

µ±Ê¹Ó÷½Ñ¡ÔñÁËÁ½ÖÖÒýÇæ£¬Æ½Ê±·Ö²¼Ê½Ëø»á¹¤×÷ÔÚÖ÷ÒýÇæÉÏ¡£Ò»µ©ËùÒÀÀµµÄÖ÷ÒýÇæ³öÏÖ¹ÊÕÏ£¬ÄÇôʹÓ÷½¿ÉÒÔͨ¹ý×Ô¶¯»òÕßÊÖ¶¯·½Ê½µ÷ÓøÃÇл»ÒýÇæ½Ó¿Ú£¬Æ½»¬µÄ½«·Ö²¼Ê½ËøÇл»µ½ÁíÒ»¸öÒýÇæÉÏÒÔ½«·çÏÕ½µµ½×îµÍ¡£×Ô¶¯Çл»·½Ê½¿ÉÒÔÀûÓÃHystrixʵÏÖ¡£ÊÖ¶¯Çл»ÍƼöµÄÒ»¸ö·½°¸ÔòÊÇʹÓÃÃÀÍŵãÆÀ»ùÓÚZookeeperµÄ»ù´¡×é¼þMCC£¬Í¨¹ý¼àÌýMCCÅäÖÃÏî¸ü¸Ä£¬À´´ïµ½ÊÖ¶¯½«·Ö²¼Ê½ÏµÍ³ËùÓÐÖ÷»úͬ²½Çл»ÒýÇæµÄÄ¿µÄ¡£ÐèҪעÒâµÄÊÇ£¬Çл»ÒýÇæÄ¿Ç°²¢²»»áÇ¨ÒÆÔ­ÒýÇæÒÑÓеÄËø¡£ÕâÑù×öµÄÄ¿µÄÊdzöÓÚ±ØÒªÐÔ¡¢ÏµÍ³¸´ÔӶȺͿɿ¿ÐÔµÄ×ۺϿ¼ÂÇ¡£ÔÚʵ¼ÊÇé¿öÏ£¬ÒýÇæ¹ÊÕϵ½Çл»ÒýÇæ£¬ÓÈÆäÊÇÊÖ¶¯Çл»ÒýÇæµÄʱ¼ä£¬ÒªÔ¶´óÓÚ·Ö²¼Ê½ËøµÄ´æ»îʱ¼ä¡£×÷Ϊ½ÏÇáÁ¿¼¶µÄCerberusÀ´Ëµ£¬Ç¨ÒÆËø»á´øÀ´²»±ØÒªµÄ¿ªÏúÒÔ¼°½Ï¸ßµÄϵͳ¸´ÔÓ¶È¡£¼øÓÚ´Ë£¬Èç¹ûÏëÒª±£Ö¤ÔÚÒýÇæ¹ÊÕϺóµÄ¾ø¶Ô¿É¿¿£¬ÄÇôÔòÐèÒª½áºÏÆäËû·½°¸À´½øÐд¦Àí¡£

³ý´ËÒÔÍ⣬Cerberus»¹ÌṩÁËÄÚÖù«Óü¯Èº£¬ÃâÈ¥´î½¨ºÍÅäÖü¯ÈºµÄ·³ÄÕ¡£CerberusÒ²ÓÐÒ»Ì×ÍêÉÆµÄÓ¦ÓÃÊÚȨ»úÖÆ£¬ÒÔ´Ë·ÀÖ¹ÒµÎñ·½Î´¾­ÆÀ¹ÀʹÓ㬶Լ¯ÈºÔì³ÉÓ°Ïì¡£

Ŀǰ£¬Cerberus·Ö²¼Ê½ËøÒѾ­³ÖÐøµü´úÁË8¸ö°æ±¾£¬ÏȺóÔÚÃÀÍŵãÆÀ¶à¸öÏîÄ¿ÖÐÎȶ¨ÔËÐС£

ÃݵÈÐÔÎÊÌâ

ËùνÃݵȣ¬¼òµ¥µØËµ£¬¾ÍÊǶԽӿڵĶà´Îµ÷ÓÃËù²úÉúµÄ½á¹ûºÍµ÷ÓÃÒ»´ÎÊÇÒ»Öµġ£À©Õ¹Ò»Ï£¬ÕâÀïµÄ½Ó¿Ú£¬¿ÉÒÔÀí½âΪ¶ÔÍâ·¢²¼µÄHTTP½Ó¿Ú»òÕßThrift½Ó¿Ú£¬Ò²¿ÉÒÔÊǽÓÊÕÏûÏ¢µÄÄÚ²¿½Ó¿Ú£¬ÉõÖÁÊÇÒ»¸öÄÚ²¿·½·¨»ò²Ù×÷¡£

ÄÇôÎÒÃÇΪʲôÐèÒª½Ó¿Ú¾ßÓÐÃݵÈÐÔÄØ£¿ÉèÏëÒ»ÏÂÒÔÏÂÇéÐΣº

ÔÚAppÖÐ϶©µ¥µÄʱºò£¬µã»÷È·ÈÏÖ®ºó£¬Ã»·´Ó¦£¬¾ÍÓÖµã»÷Á˼¸´Î¡£ÔÚÕâÖÖÇé¿öÏ£¬Èç¹ûÎÞ·¨±£Ö¤¸Ã½Ó¿ÚµÄÃݵÈÐÔ£¬ÄÇô½«»á³öÏÖÖØ¸´Ïµ¥ÎÊÌâ¡£

ÔÚ½ÓÊÕÏûÏ¢µÄʱºò£¬ÏûÏ¢ÍÆËÍÖØ¸´¡£Èç¹û´¦ÀíÏûÏ¢µÄ½Ó¿ÚÎÞ·¨±£Ö¤Ãݵȣ¬ÄÇÃ´ÖØ¸´Ïû·ÑÏûÏ¢²úÉúµÄÓ°Ïì¿ÉÄÜ»á·Ç³£´ó¡£

ÔÚ·Ö²¼Ê½»·¾³ÖУ¬ÍøÂç»·¾³¸ü¼Ó¸´ÔÓ£¬Òòǰ¶Ë²Ù×÷¶¶¶¯¡¢ÍøÂç¹ÊÕÏ¡¢ÏûÏ¢ÖØ¸´¡¢ÏìÓ¦ËÙ¶ÈÂýµÈÔ­Òò£¬¶Ô½Ó¿ÚµÄÖØ¸´µ÷ÓøÅÂÊ»á±È¼¯ÖÐʽ»·¾³Ï¸ü´ó£¬ÓÈÆäÊÇÖØ¸´ÏûÏ¢ÔÚ·Ö²¼Ê½»·¾³ÖкÜÄѱÜÃâ¡£Tyler TreatÒ²ÔÚ¡¶You Cannot Have Exactly-Once Delivery¡·Ò»ÎÄÖÐÌáµ½£º

Within the context of a distributed system, you cannot have exactly-once message delivery.

·Ö²¼Ê½»·¾³ÖУ¬ÓÐЩ½Ó¿ÚÊÇÌìÈ»±£Ö¤ÃݵÈÐԵģ¬Èç²éѯ²Ù×÷¡£ÓÐЩ¶ÔÊý¾ÝµÄÐÞ¸ÄÊÇÒ»¸ö³£Á¿£¬²¢ÇÒÎÞÆäËû¼Ç¼ºÍ²Ù×÷£¬ÄÇÒ²¿ÉÒÔ˵ÊǾßÓÐÃݵÈÐԵġ£ÆäËûÇé¿öÏ£¬ËùÓÐÉæ¼°¶ÔÊý¾ÝµÄÐ޸ġ¢×´Ì¬µÄ±ä¸ü¾Í¶¼ÓбØÒª·ÀÖ¹ÖØ¸´ÐÔ²Ù×÷µÄ·¢Éú¡£Í¨¹ý¼ä½ÓµÄʵÏÖ½Ó¿ÚµÄÃݵÈÐÔÀ´·ÀÖ¹ÖØ¸´²Ù×÷Ëù´øÀ´µÄÓ°Ï죬³ÉΪÁËÒ»ÖÖÓÐЧµÄ½â¾ö·½°¸¡£

GTIS

GTIS¾ÍÊÇÕâÑùµÄÒ»¸ö½â¾ö·½°¸¡£ËüÊÇÒ»¸öÇáÁ¿µÄÖØ¸´²Ù×÷¹Ø¿¨ÏµÍ³£¬ËüÄܹ»È·±£ÔÚ·Ö²¼Ê½»·¾³ÖвÙ×÷µÄΨһÐÔ¡£ÎÒÃÇ¿ÉÒÔÓÃËüÀ´¼ä½Ó±£Ö¤Ã¿¸ö²Ù×÷µÄÃݵÈÐÔ¡£Ëü¾ßÓÐÈçÏÂÌØµã£º

¸ßЧ£ºµÍÑÓʱ£¬µ¥¸ö·½·¨Æ½¾ùÏìӦʱ¼äÔÚ2msÄÚ£¬¼¸ºõ²»»á¶ÔÒµÎñÔì³ÉÓ°Ï죻

¿É¿¿£ºÌṩ½µ¼¶²ßÂÔ£¬ÒÔÓ¦¶ÔÍⲿ´æ´¢ÒýÇæ¹ÊÕÏËùÔì³ÉµÄÓ°Ï죻ÌṩӦÓüøÈ¨£¬Ìṩ¼¯ÈºÅäÖÃ×Ô¶¨Ò壬½µµÍ²»Í¬ÒµÎñÖ®¼äµÄ¸ÉÈÅ£»

¼òµ¥£º½ÓÈë¼ò½Ý·½±ã£¬Ñ§Ï°³É±¾µÍ¡£Ö»Ðè¼òµ¥µÄÅäÖã¬ÔÚ´úÂëÖнøÐÐÁ½¸ö·½·¨µÄµ÷Óü´¿ÉÍê³ÉËùÓеĽÓÈ빤×÷£»

Áé»î£ºÌṩ¶àÖÖ½Ó¿Ú²ÎÊý¡¢Ê¹ÓòßÂÔ£¬ÒÔÂú×㲻ͬµÄÒµÎñÐèÇó¡£

ʵÏÖÔ­Àí

»ù±¾Ô­Àí

GTISµÄʵÏÖ˼·Êǽ«Ã¿Ò»¸ö²»Í¬µÄÒµÎñ²Ù×÷¸³ÓèÆäΨһÐÔ¡£Õâ¸öΨһÐÔÊÇͨ¹ý¶Ô²»Í¬²Ù×÷Ëù¶ÔÓ¦µÄΨһµÄÄÚÈÝÌØÐÔÉú³ÉÒ»¸öΨһµÄÈ«¾ÖIDÀ´ÊµÏֵġ£»ù±¾Ô­ÔòΪ£ºÏàͬµÄ²Ù×÷Éú³ÉÏàͬµÄÈ«¾ÖID£»²»Í¬µÄ²Ù×÷Éú³É²»Í¬µÄÈ«¾ÖID¡£

Éú³ÉµÄÈ«¾ÖIDÐèÒª´æ´¢ÔÚÍⲿ´æ´¢ÒýÇæÖУ¬Êý¾Ý¿â¡¢RedisÒà»òÊÇTairµÈ¾ù¿ÉʵÏÖ¡£¿¼Âǵ½TairÌìÉú·Ö²¼Ê½ºÍ³Ö¾Ã»¯µÄÓÅÊÆ£¬Ä¿Ç°µÄGTIS´æ´¢ÔÚTairÖС£ÆäÏàÓ¦µÄkeyºÍvalueÈçÏ£º

key£º½«¶ÔÓÚ²»Í¬µÄÒµÎñ£¬²ÉÓÃAPP_KEY+ÒµÎñ²Ù×÷ÄÚÈÝÌØÐÔÉú³ÉÒ»¸öΨһ±êʶtrans_contents¡£È»ºó¶ÔΨһ±êʶ½øÐмÓÃÜÉú³ÉÈ«¾ÖID×÷ΪKey¡£

value£ºcurrent_timestamp + trans_contents£¬current_timestampÓÃÓÚ±êʶµ±Ç°µÄ²Ù×÷Ï̡߳£

ÅжÏÊÇ·ñÖØ¸´£¬Ö÷ÒªÀûÓÃTairµÄSETNX·½·¨£¬Èç¹ûÔ­À´Ã»ÓÐÖµÔòsetÇÒ·µ»Ø³É¹¦£¬Èç¹ûÒѾ­ÓÐÖµÔò·µ»ØÊ§°Ü¡£

ÄÚ²¿Á÷³Ì

GTISµÄÄÚ²¿ÊµÏÖÁ÷³ÌΪ£º

ÒµÎñ·½ÔÚÒµÎñ²Ù×÷֮ǰ£¬Éú³ÉÒ»¸öÄܹ»Î¨Ò»±êʶ¸Ã²Ù×÷µÄtransContents£¬´«ÈëGTIS£»

GTIS¸ù¾Ý´«ÈëµÄtransContents£¬ÓÃMD5Éú³ÉÈ«¾ÖID£»

GTIS½«È«¾ÖID×÷Ϊkey£¬current_timestamp+transContents×÷Ϊvalue·ÅÈëTair½øÐÐsetNx£¬½«½á¹û·µ»Ø¸øÒµÎñ·½£»

ÒµÎñ·½¸ù¾Ý·µ»Ø½á¹ûÈ·¶¨ÄÜ·ñ¿ªÊ¼½øÐÐÒµÎñ²Ù×÷£»

ÈôÄÜ£¬¿ªÊ¼½øÐвÙ×÷£»Èô²»ÄÜ£¬Ôò½áÊøµ±Ç°²Ù×÷£»

ÒµÎñ·½½«²Ù×÷½á¹ûºÍÇëÇó½á¹û´«ÈëGTIS£¬ÏµÍ³½øÐÐÒ»´ÎÇëÇó½á¹ûµÄ¼ìÑ飻

Èô¸Ã´Î²Ù×÷³É¹¦£¬GTIS¸ù¾ÝkeyÈ¡³övalueÖµ£¬¸ú´«ÈëµÄ·µ»Ø½á¹û½øÐбȶԣ¬Èç¹ûÁ½ÕßÏàµÈ£¬Ôò½«¸ÃÈ«¾ÖIDµÄ¹ýÆÚʱ¼ä¸ÄΪ½Ï³¤Ê±¼ä£»

GTIS·µ»Ø×îÖÕ½á¹û¡£

ʵÏÖÄѵã

GTISµÄʵÏÖÄѵãÔÚÓÚÈçºÎ±£Ö¤ÆäÅжÏÖØ¸´µÄ¿É¿¿ÐÔ¡£ÓÉÓÚ·Ö²¼Ê½»·¾³µÄ¸´ÔӶȺÍÒµÎñ²Ù×÷µÄ²»È·¶¨ÐÔ£¬ÔÚÉÏÒ»Õ½ڷֲ¼Ê½ËøµÄʵÏÖÖп¼ÂǵÄÍøÂç¶Ï¿ª»òÖ÷»úå´»úµÈÎÊÌ⣬ͬÑùÐèÒªÔÚGTISÖÐÉè·¨½â¾ö¡£ÕâÀïÁгö¼¸¸öµäÐ͵ij¡¾°£º

Èç¹û²Ù×÷Ö´ÐÐʧ°Ü£¬ÀíÏëµÄÇé¿öÓ¦¸ÃÊÇÁíÒ»¸öÏàͬµÄ²Ù×÷¿ÉÒÔÁ¢¼´½øÐС£Òò´Ë£¬ÐèÒª¶ÔÒµÎñ·½µÄ²Ù×÷½á¹û½øÐÐÅжϣ¬Èç¹û²Ù×÷ʧ°Ü£¬ÄÇô¾ÍÐèÒªÁ¢¼´É¾³ý¸ÃÈ«¾ÖID£»

Èç¹û²Ù×÷³¬Ê±»òÖ÷»úå´»ú£¬µ±Ç°µÄ²Ù×÷ÎÞ·¨¸æÖªGTIS²Ù×÷ÊÇ·ñ³É¹¦¡£ÄÇôÎÒÃDZØÐëÒýÈ볬ʱ»úÖÆ£¬Ò»µ©³¤Ê±¼ä»ñÈ¡²»µ½ÒµÎñ·½µÄ²Ù×÷·´À¡£¬ÄÇôҲÐèÒª¸ÃÈ«¾ÖIDʧЧ£»

½áºÏÉÏÁ½¸ö³¡¾°£¬¼ÈȻȫ¾ÖID»áʧЧ²¢ÇÒ¿ÉÄܻᱻɾ³ý£¬ÄǾÍÐèÒª±£Ö¤É¾³ýµÄ²»ÊÇÁíÒ»¸öÏàͬ²Ù×÷µÄÈ«¾ÖID¡£Õâ¾ÍÐèÒª½«ÌØÊâµÄ±êʶ¼Ç¼ÏÂÀ´£¬²¢ÓÉ´ËÀ´Åжϡ£ÕâÀïËùÓõıêʶΪµ±Ç°Ê±¼ä´Á¡£

¿ÉÒÔ¿´µ½£¬½â¾öÕâЩÎÊÌâµÄ˼·£¬Ò²ºÍÉÏÒ»Õ½ÚÖеÄʵÏÖÓкܶàÀàËÆµÄµØ·½¡£³ý´ËÒÔÍ⣬»¹Óиü¶àµÄ³¡¾°ÐèÒª¿¼ÂǺͽâ¾ö£¬ËùÓзÖÖ§Á÷³ÌÈçÏÂ:

ʹÓÃ˵Ã÷

ʹÓÃʱ£¬ÒµÎñ·½Ö»ÐèÒªÔÚ²Ù×÷µÄǰºóµ÷ÓÃGTISµÄǰÖ÷½·¨ºÍºóÖ÷½·¨£¬ÈçÏÂͼËùʾ¡£Èç¹ûǰÖ÷½·¨·µ»Ø¿É½øÐвÙ×÷£¬Ôò˵Ã÷´ËʱÎÞÖØ¸´²Ù×÷£¬¿ÉÒÔ½øÐС£·ñÔòÔòÖ±½Ó½áÊø²Ù×÷¡£

ʹÓ÷½ÐèÒª¿¼ÂǵÄÖ÷ÒªÊÇÏÂÃæÁ½¸ö²ÎÊý£º

¿Õ¼äÈ«¾ÖÐÔ£ºÒµÎñ·½ÊäÈëµÄÄܹ»±êÖ¾²Ù×÷ΨһÐÔµÄÄÚÈÝÌØÐÔ£¬¿ÉÒÔÊÇΨһÐÔµÄStringÀàÐ͵ÄID£¬Ò²¿ÉÒÔÊÇmap¡¢POJOµÈÐÎʽ¡£Èç¶©µ¥IDµÈ

ʱ¼äÈ«¾ÖÐÔ£ºÈ·¶¨Ôڶ೤ʱ¼äÄÚ²»ÔÊÐíÖØ¸´£¬1СʱÄÚ»¹ÊÇÒ»¸öÔÂÄÚÒà»òÊÇÓÀ¾Ã¡£

´ËÍ⣬GTIS»¹ÌṩÁ˲»Í¬µÄ¹ÊÕÏ´¦Àí²ßÂÔºÍÖØÊÔ»úÖÆ£¬ÒÔ´ËÀ´½µµÍÍⲿ´æ´¢ÒýÇæÒì³£¶ÔϵͳÔì³ÉµÄÓ°Ïì¡£

Ŀǰ£¬GTISÒѾ­³ÖÐøµü´úÁË7¸ö°æ±¾£¬¾àÀëµÚÒ»¸ö°æ±¾Óнü1ÄêÖ®¾Ã£¬ÏȺóÔÚÃÀÍŵãÆÀ¶à¸öÏîÄ¿ÖÐÎȶ¨ÔËÐС£

½áÓï

ÔÚ·Ö²¼Ê½»·¾³ÖУ¬²Ù×÷»¥³âÐÔÎÊÌâºÍÃݵÈÐÔÎÊÌâ·Ç³£ÆÕ±é¡£¾­¹ý·ÖÎö£¬ÎÒÃÇÕÒ³öÁ˽â¾öÕâÁ½¸öÎÊÌâµÄ»ù±¾Ë¼Â·ºÍʵÏÖÔ­Àí£¬¸ø³öÁ˾ßÌåµÄ½â¾ö·½°¸¡£

Õë¶Ô²Ù×÷»¥³âÐÔÎÊÌ⣬³£¼ûµÄ×ö·¨±ãÊÇͨ¹ý·Ö²¼Ê½ËøÀ´´¦Àí¶Ô¹²Ïí×ÊÔ´µÄÇÀÕ¼¡£·Ö²¼Ê½ËøµÄʵÏÖ£¬ºÜ´ó³Ì¶È½è¼øÁ˶àÏß³ÌºÍ¶à½ø³Ì»·¾³ÖеĻ¥³âËøµÄʵÏÖÔ­Àí¡£Ö»ÒªÂú×ãһЩ´æ´¢·½ÃæµÄ»ù±¾Ìõ¼þ£¬²¢ÇÒÄܹ»½â¾öÈçÍøÂç¶Ï¿ªµÈÒì³£Çé¿ö£¬ÄÇô¾Í¿ÉÒÔʵÏÖÒ»¸ö·Ö²¼Ê½Ëø¡£Ä¿Ç°ÒѾ­ÓлùÓÚZookeeperºÍRedisµÈ´æ´¢ÒýÇæµÄ±È½ÏµäÐ͵ķֲ¼Ê½ËøÊµÏÖ¡£µ«ÊÇÓÉÓÚµ¥´æ´¢ÒýÇæµÄ¾ÖÏÞ£¬ÎÒÃÇ¿ª·¢ÁË»ùÓÚZooKeeperºÍTairµÄ¶àÒýÇæ·Ö²¼Ê½ËøCerberus£¬Ëü¾ßÓÐʹÓÃÁé»î·½±ãµÈÖî¶àÓŵ㣬»¹ÌṩÁËÍêÉÆµÄÒ»¼ü½µ¼¶·½°¸¡£

Õë¶Ô²Ù×÷ÃݵÈÐÔÎÊÌ⣬ÎÒÃÇ¿ÉÒÔͨ¹ý·ÀÖ¹ÖØ¸´²Ù×÷À´¼ä½ÓµÄʵÏÖ½Ó¿ÚµÄÃݵÈÐÔ¡£GTISÌṩÁËÒ»Ì׿ɿ¿µÄ½â¾ö·½·¨£ºÒÀÀµÓÚ´æ´¢ÒýÇæ£¬Í¨¹ý¶Ô²»Í¬²Ù×÷Ëù¶ÔÓ¦µÄΨһµÄÄÚÈÝÌØÐÔÉú³ÉÒ»¸öΨһµÄÈ«¾ÖIDÀ´·ÀÖ¹²Ù×÷ÖØ¸´¡£

ĿǰCerberus·Ö²¼Ê½Ëø¡¢GTIS¶¼ÒÑÓ¦ÓÃÔÚÉú²ú»·¾³²¢Æ½ÎÈÔËÐС£Á½ÕßÌṩµÄ½â¾ö·½°¸ÒѾ­Äܹ»½â¾ö´ó¶àÊý·Ö²¼Ê½»·¾³ÖеIJÙ×÷»¥³âÐÔºÍÃݵÈÐÔµÄÎÊÌâ¡£ÖµµÃÒ»ÌáµÄÊÇ£¬·Ö²¼Ê½ËøºÍGTIS¶¼²»ÊÇÍòÄܵģ¬ËüÃǶÔÍⲿ´æ´¢ÏµÍ³µÄÇ¿ÒÀÀµÊ¹µÃÔÚ»·¾³²»ÄÇôÎȶ¨µÄÇé¿öÏ£¬¶Ô¿É¿¿ÐÔ»áÔì³ÉÒ»¶¨µÄÓ°Ïì¡£ÔÚ²¢·¢Á¿¹ý¸ßµÄÇé¿öÏ£¬Èç¹û²»ÄܺܺõĿØÖÆËøµÄÁ£¶È£¬ÄÇôʹÓ÷ֲ¼Ê½ËøÒ²ÊDz»Ì«ºÏÊʵġ£×ܵÄÀ´Ëµ£¬·Ö²¼Ê½»·¾³ÏµÄÒµÎñ³¡¾°·×·±¸´ÔÓ£¬Òª½â¾ö»¥³âÐÔºÍÃݵÈÐÔÎÊÌ⻹ÐèÒª½áºÏµ±Ç°ÏµÍ³¼Ü¹¹¡¢ÒµÎñÐèÇóºÍδÀ´Ñݽø×ۺϿ¼ÂÇ¡£Cerberus·Ö²¼Ê½ËøºÍGTISÒ²»á³ÖÐø²»¶ÏµØµü´ú¸üУ¬Ìṩ¸ü¶àµÄÒýÇæÑ¡Ôñ¡¢¸ü¸ßЧ¿É¿¿µÄʵÏÖ·½Ê½¡¢¸ü¼ò½ÝµÄ½ÓÈëÁ÷³Ì£¬ÒÔÆÚÂú×ã¸ü¸´ÔÓµÄʹÓó¡¾°ºÍÒµÎñÐèÇó¡£

   
2381 ´Îä¯ÀÀ       30
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù

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

Ïà¹ØÎÄÕÂ


ר¼ÒÊӽǿ´ITÓë¼Ü¹¹
Èí¼þ¼Ü¹¹Éè¼Æ
ÃæÏò·þÎñÌåϵ¼Ü¹¹ºÍÒµÎñ×é¼þ
ÈËÈËÍøÒÆ¶¯¿ª·¢¼Ü¹¹
¼Ü¹¹¸¯»¯Ö®ÃÕ
̸ƽ̨¼´·þÎñPaaS

Ïà¹ØÅàѵ¿Î³Ì


ÃæÏòÓ¦Óõļܹ¹Éè¼ÆÊµ¼ù
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Èí¼þ¼Ü¹¹Ê¦¡ª¸ß¼¶Êµ¼ù
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
SOAÌåϵ½á¹¹Êµ¼ù

³É¹¦°¸Àý


Èñ°²¿Æ¼¼ Èí¼þ¼Ü¹¹Éè¼Æ·½·¨
³É¶¼ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£Æû³µ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
±±¾© Èí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£ Èí¼þ¼Ü¹¹Éè¼Æ°¸ÀýÓëʵ¼ù
±±¾© ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ÉîÛÚ ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù