|
|
|
|
¹«ÖںžØÕó
´´½¨×¨À¸

Íú²ÆºÍСǿµÄÈýÉúÈýÊÀ

Íú²ÆºÍСǿÊÇÏ̳߳صÄÁ½¸öỊ̈߳¬ ËûÃǾ­³£×öµÄ¹¤×÷¾ÍÊǶÔÒ»¸öÊý¼Ó¼Ó¼õ¼õ£¬ÓÃÈËÀàµÄ»°À´Ëµ¾ÍÊÇ´æ¿î£¬È¡¿î¡£

×÷ÕߣºÁõÐÀ|2021-04-22 15:26

 ***ÊÀ

Íú²ÆºÍСǿÊÇÏ̳߳صÄÁ½¸öỊ̈߳¬ ËûÃǾ­³£×öµÄ¹¤×÷¾ÍÊǶÔÒ»¸öÊý¼Ó¼Ó¼õ¼õ£¬ÓÃÈËÀàµÄ»°À´Ëµ¾ÍÊÇ´æ¿î£¬È¡¿î¡£

  1. public class Account{ 
  2.    private int balance; 
  3.    public synchronized void deposit(int amt){ 
  4.        balance += amt; 
  5.    } 
  6.  
  7.    public synchronized void withdraw(int amt){ 
  8.        if(balance >= amt){ 
  9.            balance -= amt; 
  10.        } 
  11.        throw new RuntimeException("insufficent blance"); 
  12.    } 

(ÓÑÇéÌáʾ£¬¿É×óÓÒ»¬¶¯£¬ÏÂͬ)

ÿ´Î½øÐдæ¿î£¬È¡¿î²Ù×÷µÄʱºò£¬ËûÃÇÁ½¸ö¶¼ÐèÒª»ñµÃÒ»°ÑËø£¬ÕâÑù¾ÍÄܱ£Ö¤Í¬Ò»Ê±¿ÌÖ»ÓÐÒ»¸öÈËÔÚÐ޸쬲»»á³öÂÒ×Ó¡£

ÕâÒ»Ì죬ËûÃÇÁ©ÓÖÓöµ½ÁËÒ»¸ö½Ð×öתÕ˵IJÙ×÷£º

  1. public void transfer(Account from,Account toint amt){ 
  2.    synchronized(from){ 
  3.        synchronized(to){ 
  4.            from.withdraw(amt); 
  5.            to.deposit(amt); 
  6.        } 
  7.    } 

Íú²ÆËµ£º“Õâ¸ö³ÌÐòÔ±²»´í£¬¿¼ÂǵÃͦÖÜÈ«¡£×ªÕ˵Äʱºò°ÑÁ½¸öÕË»§¶¼Ëø×¡ÁË£¬°²È«!”

Сǿ˵£º“û´í£¬Ö´ÐаÉ¡£”

Íú²ÆÕâ¸öÏ̴߳ÓAÏòBתÕË £¬ Óë´Ëͬʱ£¬Ð¡Ç¿´ÓBÏòAתÕË

ÁîÍú²ÆºÍСǿûÓÐÏëµ½µÄÊÇ£¬¾ÓÈ»³öÏÖÁËËÀËø¡£

ÀàËÆµÄʼþ·¢Éú²»ÉÙ£¬ Ï̳߳صÄÏß³ÌÓùâÁË£¬Tomcat±»ÆÈÖØÆô£¬Õâ¸öÊÀ½ç»ÙÃðÁË¡£

µÚ¶þÊÀ

ÐÂÉú´úµÄÍú²ÆºÍСǿ´ÓÏ̳߳ØÖгöÀ´£¬ TomcatÀÏ´ó¸øËûÃǽ²ÁËÉÏÒ»´úÍú²ÆºÍСǿµÄ¹ÊÊ£¬ ¶ÔËûÃÇ×»×»½Ìµ¼£º“×öתÕ˲Ù×÷µÄʱºòÒ»¶¨ÒªÐ¡ÐÄ£¬±ðËÀËøÁË!”

Íú²ÆºÍСǿÓеã¶ù·ß·ß²»Æ½£º“ÕâÎÒÃÇÁ©Ò²¿ØÖƲ»Á˰¡£¬ÕâÒª¿´³ÌÐòԱдµÄ´úÂ룬ÒÔ¼°²Ù×÷ϵͳÖеÄÏ̵߳÷¶È°¡!”

²»Âú¹é²»Âú£¬ËûÁ©»¹ÊÇÓеãСÆÚ´ý£¬Ïë¿´¿´¿ÉŵÄתÕË´úÂëµ½µ×ÔõôÑù¡£

û¹ý¶à¾Ã£¬ ËûÁ©¾ÍÈçÔ¸ÁË£º

  1. public static final Object lock = new Object(); 
  2. public void transfer(Account from,Account toint amt){ 
  3.    int fromHash = System.identityHashCode(from); 
  4.    int toHash = System.identityHashCode(to); 
  5.    if(fromHash > toHash){ 
  6.        synchronized(from){ 
  7.            synchronized(to){ 
  8.                from.withdraw(amt); 
  9.                to.deposit(amt); 
  10.            } 
  11.        } 
  12.    } 
  13.    else if(toHash > fromHash){ 
  14.        synchronized(to){ 
  15.            synchronized(from){ 
  16.                from.withdraw(amt); 
  17.                to.deposit(amt); 
  18.            } 
  19.        } 
  20.    } 
  21.    else { 
  22.        synchronized(lock){ 
  23.            synchronized(from){ 
  24.                synchronized(to){ 
  25.                    from.withdraw(amt); 
  26.                    to.deposit(amt); 
  27.                } 
  28.            } 
  29.        } 
  30.    } 

¿´µ½ÕâÑùµÄ´úÂ룬 Íú²Æµ¹ÎüÁËÒ»¿ÚÆø£¬ÄÓ×Åͷ˵£º“¸ãʲô¹í£¬×ª¸öÕ˶¼ÕâôÂé·³!”

Сǿ˵£º“ÀÏ´ó²»ÊÇ˵ÁËÂð£¬ÉÏÒ»´úÏß³ÌÀÏÊÇÔÚתÕËÕâÀï³ö´í£¬ÓÚÊÇ´úÂë¾ÍÖØÐ´ÁË¡£Äã¿´£¬ÕâÒ»´ÎдµÃ¾ÍºÜÑϽ÷ÁË£¬Ã¿Ò»´Î¶¼»áÈ¥±È½ÏÁ½¸öÕË»§µÄ´óС(ͨ¹ýhash code)£¬Ë­´ó¾ÍÏÈ»ñµÃË­µÄËø¡£ ”

Íú²ÆËµ£º“°Â£¬Ï൱ÓÚ°ÑÕË»§¸øÅÅÁËÐò£¬¼ÙÉèÕË»§A´óÓÚÕË»§B £¬ ÄÇÎÒÃÇÁ©×ªÕ˵Äʱºò£¬Ã¿´Î¶¼ÏÈ»ñµÃAµÄËø£¬ÕâÑù¾Í²»»á»¥ÏàµÈ´ýÁË¡£ ”

“û´í£¬»¹ÓÐÒ»¸öÌØÊâÇé¿ö£¬Èç¹ûÕâÁ½¸öÕË»§µÄhash code Ïàͬ£¬ÄǾÍÔÙÈ¥¾ºÕùÁíÍâÒ»¸öÌØÊâµÄËø£¬Ë­ÇÀµ½Ë­¾Í¿ÉÒÔÏÈÖ´ÐС£ÁíÒ»¸ö¾ÍÔÚÄÇÀïµÈ´ý¡£”

Íú²ÆºÍСǿÕâ´Î˳ÀûµØ°ÑתÕ˸øÖ´ÐÐÍêÁË£¬»ØÈ¥¸øTomcat»ã±¨ÁËÒ»±é¡£

TomcatÀÏ´ó¸Ð¿®µØËµ£º“ÓÐÕâô¸´ÔӵĴúÂ룬¿É¼ûʹÓѹ²ÏíÄڴ撵ķ½Ê½À´²¢·¢±à³ÌºÜ²»ÈÝÒ×°¡!”

“¹²ÏíÄÚ´æ?”

“¶Ô°¡£¬Äã¿´ÕâЩÕË»§µÄÊý¾Ý£¬Ã¿¸öÏ̶߳¼¿ÉÒÔ·ÃÎÊ£¬²»¾ÍÊǹ²ÏíÄÚ´æÂ𣬠ΪÁËÄܹ»°²È«·ÃÎÊ£¬Ö»ÓÐÀ´‘¼ÓËø’ÁË¡£ ¹ÅÈË˵£¬Õâ¸öÊÀ½çÉÏÓÐÁ½ÖÖ¹¹½¨Èí¼þµÄ·½Ê½£¬Ò»ÖÖ·½·¨ÊÇʹÆä×ã¹»¼òµ¥ÒÔÖÁÓÚ²»´æÔÚÃ÷ÏÔµÄȱÏÝ£¬ÁíÍâÒ»ÖÖÊÇʹÆä×ã¹»¸´ÔÓÒÔÖÁÓÚ¿´²»³öÓÐʲôÎÊÌâ¡£ÎҺܵ£Ðİ¡£¬ ÏÖÔÚÕâ¸öϵͳ¾ÍÊôÓÚµÚ¶þÖÖ£¬²»ÖªµÀÓжàÉÙ¿ÓÔÚµÈ×ÅÎÒÃÇÄØ!”

(ÂëÅ©·­Éí£º ʵ¼ÊÉÏÕâ¾ä»°ÊÇÍÐÄá·»ô¶û˵µÄ)

ÀÏ´ó²»ÐÒÑÔÖУ¬ÖÕÓÚÓÐÒ»Ì죬Õâ¸ö¸´ÔÓµ½¿´²»³öÎÊÌâµÄϵͳ±ÀÀ£ÁË£¬Õâ¸öÊÀ½çÓÖ»ÙÃðÁË¡£

µÚÈýÊÀ

µÚÈý´úµÄÍú²ÆºÍСǿ´ÓÏ̳߳سöÀ´¡£

³ö·¢Ç°£¬TomcatÀÏ´ó°ÑǰÁ½´úÏß³ÌÓöµ½µÄÎÊÌâ¸øËûÃÇ˵ÁËÒ»±é£¬Íþв˵£ºÈç¹ûÔÙ³öÏÖËÀËø£¬Ð¡ÐÄÄãÃÇÁ½¸öµÄÄÔ´ü!

Íú²ÆºÍСǿսս¾¤¾¤£¬ÈçÂı¡±ùµØÖ´ÐдúÂë¡£

×îÖÕËûÃÇ»¹ÊÇÓöµ½ÁË´«ËµÖеĿÉŵÄתÕË´úÂ룺

  1. def transfer(from: Account, to: Account,amt:Int){ 
  2.    atomic{ 
  3.        from.withdraw(amt); 
  4.        to.deposit(amt); 
  5.    } 

Íú²Æ·Ç³£³Ô¾ª£º“ÕâÊÇʲô´úÂë?²»ÊÇJava?”

Сǿ˵£º“àÅ£¬²»ÊÇJava £¬ÊÇScalaдµÄ£¬ÕâÊÇÔËÐÐÔÚJVMÉϵÄÒ»¸öÓïÑÔ¡£”

(ÂëÅ©·­Éí×¢£ºÊµ¼ÊÉÏJVMÏß³ÌÄÜ¿´µ½µÄÖ»ÊÇJava ×Ö½ÚÂ룬¸ù±¾¿´²»µ½Ô´Â룬Ҳ¾Í²»ÖªµÀÊÇJavaдµÄ´úÂ룬»¹ÊÇScalaдµÄ´úÂ룬 ÕâÀïÖ»ÊÇΪÁËչʾ·½±ã¡£)

Íú²ÆËµ£º“ÔõôÕâô¼òµ¥£¬»á²»»á³öÎÊÌâ?ÄǸöatomicÊÇÔõô»ØÊÂ?±íʾԭ×ÓÖ´ÐÐ?”

СǿҲÓеã㣬²»¸ÒóȻȥִÐУº“ÔÛÃÇ»¹ÊÇÈ¥ÎÊTomcatÀÏ´ó°É¡£”

Tomcat¿´ÁËÒ»ÑÛ£º“ÈËÀà³ÌÐòÔ±ÓָĴúÂëÁ˰¡£¬¿ªÊ¼Ê¹ÓÃSoftware Transaction Memory(STM)ÁË¡£ È¥°ÑSTMÀÏÍ·¶ù½ÐÀ´£¬ÈÃËû¸øÄãÁ©½âÊÍ¡£”

STMÀÏÍ·¶ùÂúÁ³²×É££º“·ÅÐÄÖ´ÐаÉ£¬Ö»ÒªÄã°Ñ´úÂë·Åµ½atomicÖУ¬ÎÒ¾ÍÄܱ£Ö¤ËûÃÇÏñÊÂÎñÒ»Ñù£¬ÊµÏÖACID£¬Å¶²»£¬D(³Ö¾Ã»¯)ʵÏÖ²»ÁË£¬ÕâЩÊý¾Ý¶¼ÊÇÔÚÄÚ´æÖеÄ¡£”

“ÕâÓÐʲôÓÃ? ”

“¿ÉÒÔÈÃÄãÃÇÁ©°²È«µØ²¢·¢Ö´Ðа¡?”

Íú²ÆºÍÐ¡Ç¿ÃæÃæÏàêÕâÁ¬Ëø¶¼Ã»ÓУ¬»¹°²È«µØ²¢·¢?

“±ð¿´Ã»ÓÐËø£¬” STMÀÏÍ·¶ù˵£¬“ÔÚatomic´úÂ뿪ʼִÐеÄʱºò£¬ÎÒ»á¼Ç¼Ï´úÂë¿éÉæ¼°µ½µÄÊý¾ÝµÄÖµ(¸´ÖÆÁËÒ»·Ý)£¬È»ºó²ÅÕæÕýÖ´ÐУ¬Ö´ÐÐÍêÁËÒª‘Ìá½»’£¬ ÕâʱºòÎһῴ¿´ÄÇЩÊý¾ÝµÄÖµÊÇ·ñÒ²±»±ðµÄÏ̸߳͝ÁË£¬Èç¹ûÓи͝£¬ÄDZ¾´Î¸Ä¶¯¾Í³·Ïú£¬ÖØÐ´ӴúÂ뿪ʼ´¦Ö´ÐС£ ”

ÀÏÍ·¶ù»­ÁËÒ»¸öͼ£¬Õ¹Ê¾Íú²Æ´ÓÕË»§A¸øÕË»§Bת20Ôª£¬ Óë´ËͬʱСǿ´ÓBÏòAת30Ôª¡£

»¹ÕæÊÇ£¬Ã»ÓмÓËø¾Í°²È«µØÍê³ÉÁËÁ½¸ö²¢·¢²Ù×÷¡£

µ±È»£¬ÀÏÍ·¶ùΪÁËʵÏÖÕâ¸öatomic²Ù×÷£¬±³ºó͵͵×öÁ˲»ÉÙÊÂÇ飺¸´ÖÆÊý¾Ý£¬Ìá½»£¬Öظ´Ö´ÐС£

Íú²ÆÏëÆðÀ´×Ô¼ºÔø¾­Ö´ÐйýÒ»ÏÂJava µÄCompare and swapµÄ´úÂ룬˵µÀ£º“ÄãÕâ²»¾ÍÊÇCASÂï!”

ÀÏÍ·¶ù˵£º“Ô­ÀíÉÏÀàËÆ£¬¶¼ÊÇÀÖ¹ÛËø£¬²»¹ýÎÒÕâ¸ö·½Ê½ºÍÊý¾Ý¿âµÄÊÂÎñ¸ü¼ÓÀàËÆ£¬ËùÒÔ½Ð×öSoftware Transaction Memory¡£”

СǿÏëÁËÏ룬˵µÀ£º“²»¶Ô°¡£¬atomicÊǸö´úÂë¿é£¬Àï±ß¿ÉÄÜÓкܶà´úÂë£¬Éæ¼°µ½ºÜ¶àclass£¬ ÄãÔõô֪µÀÄÄЩ×Ö¶ÎÐèÒª±»STM¹ÜÀíÆðÀ´°¡!”

STMÀÏÍ·¶ù˵£º“ÕâÕæÊǸöºÃÎÊÌ⣬ʵ¼ÊÉÏ£¬ÐèÒª³ÌÐòÔ±ÃÇÀ´¸æËßÎÒ¡£±ÈÈçʹÓÃÕâ¸ö·½·¨”

  1. class Account(val initialBalance : Int){ 
  2.  val balance = Ref(initialBalance) 
  3.  ...... 

“¿´µ½ÄǸöRefûÓУ¬Õâ¾ÍÊÇÒ»ÖÖ°ì·¨£¬Í¨¹ýËü£¬ÎÒ¾ÍÖªµÀÕâ¸öbalanceµÄ×Ö¶ÎÐèÒªÈÃÎÒ¹ÜÀíÆðÀ´£¬ÔÚatomic´úÂë¿éÔËÐеÄʱºò£¬¾ÍÐèÒª¸´ÖÆËüµÄÖµ£¬±È½ÏËüµÄÖµ¡£”

“Ã÷°×ÁË£¬µ«ÊÇ‘ÖØ¸´Ö´ÐÐ’ÓÐÎÊÌâ°¡£¬¼ÙÉè³ÌÐòÔ±ÕÅ´óÅÖÊÇÕâôд´úÂëµÄ£º”

  1. def transfer(from: Account, to: Account,amt:Int){ 
  2.     atomic{ 
  3.         from.withdraw(amt); 
  4.         ...ÔÚÕâÀïÖ´ÐÐһЩÆäËû²Ù×÷£¬ÀýÈç´òÓ¡ÈÕÖ¾£¬·¢ËÍÓʼþ..... 
  5.         to.deposit(amt); 
  6.     } 

“ÕâÆäÖÐÓÐһЩ´òÓ¡ÈÕÖ¾£¬·¢ËÍÓʼþµÄ²Ù×÷£¬ÄÇÄãÖØ¸´Ö´ÐУ¬Æñ²»»áÖ´Ðкܶà´Î£¬¾ÍÍêÈ«ÂÒÌ×ÁË¡£”

STMÀÏÍ·¶ù˵£º“²»´í£¬ÏëµÃͦÉÄã˵µÄÕâЩ²Ù×÷£¬ÎÒ°ÑËûÃǽÐ×ö¸±×÷Ó㬲»ÄÜÖØ¸´Ö´ÐУ¬²»Äܷŵ½atomic´úÂë¿éÖÐÈÃSTM¹ÜÀí¡£»»¾ä»°ËµatomicÖеĴúÂëÓ¦¸ÃÊÇÃݵȵÄ¡£Èç¹ûÎ¥±³ÁËÕâÒ»µã£¬ºó¹û×Ô¸º!”

СǿÐÄÖÐÒ»ÁÝ£º“ÕâÊdzÌÐòÔ±Òª²ÙÐĵÄÊÂÇéÁË£¬²»¹ÜÎÒÁ©µÄÊÂÇ飬 ²»¹ý¼´Ê¹Èç´Ë£¬ËûÃǵĴúÂëÒ²¼«¶ÈµØ¼ò»¯ÁË£¬Ö»ÐèÒªÓøöatomic£¬¾ÍÄÜʵÏÖ°²È«µØ²¢·¢£¬ÊµÔÚÊÇ̫ˬÁË¡£”

Íú²ÆËµµÀ£º“Äã˵µÃÌ컨ÂÒ×¹£¬ÕâSTMÓÐʲôȱµã?”

ÀÏÍ·¶ù˵£º“ÌìÏÂûÓÐÃâ·ÑµÄÎç²Í£¬ºÜÈÝÒ×Ïëµ½STMµÄ¾ÖÏÞÐÔ£¬ Èç¹û¶ÔÓÚͬһ¸öÊý¾Ý£¬²¢·¢Ð´ÈëºÜ¶àµÄʱºò£¬³åÍ»¾Í´ó´óÔö¼ÓÁË£¬²»¶ÏµØÖظ´Ö´ÐУ¬Ð§ÂʺܵÍ¡£ËùÒÔ¸üÊʺÏдÈëÉÙ£¬¶ÁÈ¡¶àµÄ³¡¾°¡£”

“ºÃ°É£¬ÎÒÃÇÕâ¾ÍÖ´ÐÐÕâ¸öתÕ˲Ù×÷£¬ÓÐÎÊÌâ¾ÍÕÒÄã!”

¡¾±¾ÎÄΪ51CTOרÀ¸×÷Õß“ÁõÐÀ”µÄÔ­´´¸å¼þ£¬×ªÔØÇëͨ¹ý×÷Õß΢ÐŹ«ÖÚºÅcoderising»ñÈ¡ÊÚȨ¡¿

´ÁÕâÀ¿´¸Ã×÷Õ߸ü¶àºÃÎÄ

¡¾±à¼­ÍƼö¡¿

  1. 2018ÈóÌÐòÔ±±ÀÀ£µÄ˲¼ä£¡¿´µ½ÄÄÒ»¸öÄã¿ÞÁË£¿
  2. Ϊʲô°¢Àï°Í°ÍÒªÇó³ÌÐòÔ±½÷É÷ÐÞ¸ÄserialVersionUID ×ֶεÄÖµ
  3. ÖйúÓжàÉÙ¸ö³ÌÐòÔ±£¿
  4. ³ÌÐòÔ±¿¸¹ýº®¶¬£¬Ò»¶¨Òª¿´12ÔµÄÕâʮƪÈÈÃÅÎÄÕÂ
  5. ¡°²ËÄñ¡±³ÌÐòÔ±ºÍ¡°´óÉñ¡±³ÌÐòÔ±µÄ²î±ð¾¹È»Õâô´ó...
¡¾ÔðÈα༭£ºÎäÏþÑà TEL£º£¨010£©68476606¡¿

µãÔÞ 0
·ÖÏí:
´ó¼Ò¶¼ÔÚ¿´
²ÂÄãϲ»¶