Íú²ÆºÍСǿµÄÈýÉúÈýÊÀ
Íú²ÆºÍСǿÊÇÏ̳߳صÄÁ½¸öỊ̈߳¬ ËûÃǾ³£×öµÄ¹¤×÷¾ÍÊǶÔÒ»¸öÊý¼Ó¼Ó¼õ¼õ£¬ÓÃÈËÀàµÄ»°À´Ëµ¾ÍÊÇ´æ¿î£¬È¡¿î¡£
- ×÷ÕߣºÁõÐÀ|2021-04-22 15:26
***ÊÀ
Íú²ÆºÍСǿÊÇÏ̳߳صÄÁ½¸öỊ̈߳¬ ËûÃǾ³£×öµÄ¹¤×÷¾ÍÊǶÔÒ»¸öÊý¼Ó¼Ó¼õ¼õ£¬ÓÃÈËÀàµÄ»°À´Ëµ¾ÍÊÇ´æ¿î£¬È¡¿î¡£
- public class Account{
- private int balance;
- public synchronized void deposit(int amt){
- balance += amt;
- }
- public synchronized void withdraw(int amt){
- if(balance >= amt){
- balance -= amt;
- }
- throw new RuntimeException("insufficent blance");
- }
- }
(ÓÑÇéÌáʾ£¬¿É×óÓÒ»¬¶¯£¬ÏÂͬ)
ÿ´Î½øÐдæ¿î£¬È¡¿î²Ù×÷µÄʱºò£¬ËûÃÇÁ½¸ö¶¼ÐèÒª»ñµÃÒ»°ÑËø£¬ÕâÑù¾ÍÄܱ£Ö¤Í¬Ò»Ê±¿ÌÖ»ÓÐÒ»¸öÈËÔÚÐ޸쬲»»á³öÂÒ×Ó¡£
ÕâÒ»Ì죬ËûÃÇÁ©ÓÖÓöµ½ÁËÒ»¸ö½Ð×öתÕ˵IJÙ×÷£º
- public void transfer(Account from,Account to, int amt){
- synchronized(from){
- synchronized(to){
- from.withdraw(amt);
- to.deposit(amt);
- }
- }
- }
Íú²ÆËµ£º“Õâ¸ö³ÌÐòÔ±²»´í£¬¿¼ÂǵÃͦÖÜÈ«¡£×ªÕ˵Äʱºò°ÑÁ½¸öÕË»§¶¼Ëø×¡ÁË£¬°²È«!”
Сǿ˵£º“û´í£¬Ö´Ðаɡ£”
Íú²ÆÕâ¸öÏ̴߳ÓAÏòBתÕË £¬ Óë´Ëͬʱ£¬Ð¡Ç¿´ÓBÏòAתÕË
ÁîÍú²ÆºÍСǿûÓÐÏëµ½µÄÊÇ£¬¾ÓÈ»³öÏÖÁËËÀËø¡£
ÀàËÆµÄʼþ·¢Éú²»ÉÙ£¬ Ï̳߳صÄÏß³ÌÓùâÁË£¬Tomcat±»ÆÈÖØÆô£¬Õâ¸öÊÀ½ç»ÙÃðÁË¡£
µÚ¶þÊÀ
ÐÂÉú´úµÄÍú²ÆºÍСǿ´ÓÏ̳߳ØÖгöÀ´£¬ TomcatÀÏ´ó¸øËûÃǽ²ÁËÉÏÒ»´úÍú²ÆºÍСǿµÄ¹ÊÊ£¬ ¶ÔËûÃÇ×»×»½Ìµ¼£º“×öתÕ˲Ù×÷µÄʱºòÒ»¶¨ÒªÐ¡ÐÄ£¬±ðËÀËøÁË!”
Íú²ÆºÍСǿÓеã¶ù·ß·ß²»Æ½£º“ÕâÎÒÃÇÁ©Ò²¿ØÖƲ»Á˰¡£¬ÕâÒª¿´³ÌÐòԱдµÄ´úÂ룬ÒÔ¼°²Ù×÷ϵͳÖеÄÏ̵߳÷¶È°¡!”
²»Âú¹é²»Âú£¬ËûÁ©»¹ÊÇÓеãСÆÚ´ý£¬Ïë¿´¿´¿ÉŵÄתÕË´úÂëµ½µ×ÔõôÑù¡£
û¹ý¶à¾Ã£¬ ËûÁ©¾ÍÈçÔ¸ÁË£º
- public static final Object lock = new Object();
- public void transfer(Account from,Account to, int amt){
- int fromHash = System.identityHashCode(from);
- int toHash = System.identityHashCode(to);
- if(fromHash > toHash){
- synchronized(from){
- synchronized(to){
- from.withdraw(amt);
- to.deposit(amt);
- }
- }
- }
- else if(toHash > fromHash){
- synchronized(to){
- synchronized(from){
- from.withdraw(amt);
- to.deposit(amt);
- }
- }
- }
- else {
- synchronized(lock){
- synchronized(from){
- synchronized(to){
- from.withdraw(amt);
- to.deposit(amt);
- }
- }
- }
- }
- }
¿´µ½ÕâÑùµÄ´úÂ룬 Íú²Æµ¹ÎüÁËÒ»¿ÚÆø£¬ÄÓ×Åͷ˵£º“¸ãʲô¹í£¬×ª¸öÕ˶¼ÕâôÂé·³!”
Сǿ˵£º“ÀÏ´ó²»ÊÇ˵ÁËÂð£¬ÉÏÒ»´úÏß³ÌÀÏÊÇÔÚתÕËÕâÀï³ö´í£¬ÓÚÊÇ´úÂë¾ÍÖØÐ´ÁË¡£Äã¿´£¬ÕâÒ»´ÎдµÃ¾ÍºÜÑϽ÷ÁË£¬Ã¿Ò»´Î¶¼»áÈ¥±È½ÏÁ½¸öÕË»§µÄ´óС(ͨ¹ýhash code)£¬Ë´ó¾ÍÏÈ»ñµÃ˵ÄËø¡£ ”
Íú²ÆËµ£º“°Â£¬Ï൱ÓÚ°ÑÕË»§¸øÅÅÁËÐò£¬¼ÙÉèÕË»§A´óÓÚÕË»§B £¬ ÄÇÎÒÃÇÁ©×ªÕ˵Äʱºò£¬Ã¿´Î¶¼ÏÈ»ñµÃAµÄËø£¬ÕâÑù¾Í²»»á»¥ÏàµÈ´ýÁË¡£ ”
“û´í£¬»¹ÓÐÒ»¸öÌØÊâÇé¿ö£¬Èç¹ûÕâÁ½¸öÕË»§µÄhash code Ïàͬ£¬ÄǾÍÔÙÈ¥¾ºÕùÁíÍâÒ»¸öÌØÊâµÄËø£¬ËÇÀµ½Ë¾Í¿ÉÒÔÏÈÖ´ÐС£ÁíÒ»¸ö¾ÍÔÚÄÇÀïµÈ´ý¡£”
Íú²ÆºÍСǿÕâ´Î˳ÀûµØ°ÑתÕ˸øÖ´ÐÐÍêÁË£¬»ØÈ¥¸øTomcat»ã±¨ÁËÒ»±é¡£
TomcatÀÏ´ó¸Ð¿®µØËµ£º“ÓÐÕâô¸´ÔӵĴúÂ룬¿É¼ûʹÓѹ²ÏíÄڴ撵ķ½Ê½À´²¢·¢±à³ÌºÜ²»ÈÝÒ×°¡!”
“¹²ÏíÄÚ´æ?”
“¶Ô°¡£¬Äã¿´ÕâЩÕË»§µÄÊý¾Ý£¬Ã¿¸öÏ̶߳¼¿ÉÒÔ·ÃÎÊ£¬²»¾ÍÊǹ²ÏíÄÚ´æÂ𣬠ΪÁËÄܹ»°²È«·ÃÎÊ£¬Ö»ÓÐÀ´‘¼ÓËø’ÁË¡£ ¹ÅÈË˵£¬Õâ¸öÊÀ½çÉÏÓÐÁ½ÖÖ¹¹½¨Èí¼þµÄ·½Ê½£¬Ò»ÖÖ·½·¨ÊÇʹÆä×ã¹»¼òµ¥ÒÔÖÁÓÚ²»´æÔÚÃ÷ÏÔµÄȱÏÝ£¬ÁíÍâÒ»ÖÖÊÇʹÆä×ã¹»¸´ÔÓÒÔÖÁÓÚ¿´²»³öÓÐʲôÎÊÌâ¡£ÎҺܵ£Ðİ¡£¬ ÏÖÔÚÕâ¸öϵͳ¾ÍÊôÓÚµÚ¶þÖÖ£¬²»ÖªµÀÓжàÉÙ¿ÓÔÚµÈ×ÅÎÒÃÇÄØ!”
(ÂëÅ©·Éí£º ʵ¼ÊÉÏÕâ¾ä»°ÊÇÍÐÄá·»ô¶û˵µÄ)
ÀÏ´ó²»ÐÒÑÔÖУ¬ÖÕÓÚÓÐÒ»Ì죬Õâ¸ö¸´ÔÓµ½¿´²»³öÎÊÌâµÄϵͳ±ÀÀ£ÁË£¬Õâ¸öÊÀ½çÓÖ»ÙÃðÁË¡£
µÚÈýÊÀ
µÚÈý´úµÄÍú²ÆºÍСǿ´ÓÏ̳߳سöÀ´¡£
³ö·¢Ç°£¬TomcatÀÏ´ó°ÑǰÁ½´úÏß³ÌÓöµ½µÄÎÊÌâ¸øËûÃÇ˵ÁËÒ»±é£¬Íþв˵£ºÈç¹ûÔÙ³öÏÖËÀËø£¬Ð¡ÐÄÄãÃÇÁ½¸öµÄÄÔ´ü!
Íú²ÆºÍСǿսս¾¤¾¤£¬ÈçÂı¡±ùµØÖ´ÐдúÂë¡£
×îÖÕËûÃÇ»¹ÊÇÓöµ½ÁË´«ËµÖеĿÉŵÄתÕË´úÂ룺
- def transfer(from: Account, to: Account,amt:Int){
- atomic{
- from.withdraw(amt);
- to.deposit(amt);
- }
- }
Íú²Æ·Ç³£³Ô¾ª£º“ÕâÊÇʲô´úÂë?²»ÊÇ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ÀÏÍ·¶ù˵£º“ÕâÕæÊǸöºÃÎÊÌ⣬ʵ¼ÊÉÏ£¬ÐèÒª³ÌÐòÔ±ÃÇÀ´¸æËßÎÒ¡£±ÈÈçʹÓÃÕâ¸ö·½·¨”
- class Account(val initialBalance : Int){
- val balance = Ref(initialBalance)
- ......
- }
“¿´µ½ÄǸöRefûÓУ¬Õâ¾ÍÊÇÒ»ÖÖ°ì·¨£¬Í¨¹ýËü£¬ÎÒ¾ÍÖªµÀÕâ¸öbalanceµÄ×Ö¶ÎÐèÒªÈÃÎÒ¹ÜÀíÆðÀ´£¬ÔÚatomic´úÂë¿éÔËÐеÄʱºò£¬¾ÍÐèÒª¸´ÖÆËüµÄÖµ£¬±È½ÏËüµÄÖµ¡£”
“Ã÷°×ÁË£¬µ«ÊÇ‘ÖØ¸´Ö´ÐÐ’ÓÐÎÊÌâ°¡£¬¼ÙÉè³ÌÐòÔ±ÕÅ´óÅÖÊÇÕâôд´úÂëµÄ£º”
- def transfer(from: Account, to: Account,amt:Int){
- atomic{
- from.withdraw(amt);
- ...ÔÚÕâÀïÖ´ÐÐһЩÆäËû²Ù×÷£¬ÀýÈç´òÓ¡ÈÕÖ¾£¬·¢ËÍÓʼþ.....
- to.deposit(amt);
- }
- }
“ÕâÆäÖÐÓÐһЩ´òÓ¡ÈÕÖ¾£¬·¢ËÍÓʼþµÄ²Ù×÷£¬ÄÇÄãÖØ¸´Ö´ÐУ¬Æñ²»»áÖ´Ðкܶà´Î£¬¾ÍÍêÈ«ÂÒÌ×ÁË¡£”
STMÀÏÍ·¶ù˵£º“²»´í£¬ÏëµÃͦÉÄã˵µÄÕâЩ²Ù×÷£¬ÎÒ°ÑËûÃǽÐ×ö¸±×÷Ó㬲»ÄÜÖØ¸´Ö´ÐУ¬²»Äܷŵ½atomic´úÂë¿éÖÐÈÃSTM¹ÜÀí¡£»»¾ä»°ËµatomicÖеĴúÂëÓ¦¸ÃÊÇÃݵȵġ£Èç¹ûÎ¥±³ÁËÕâÒ»µã£¬ºó¹û×Ô¸º!”
СǿÐÄÖÐÒ»ÁÝ£º“ÕâÊdzÌÐòÔ±Òª²ÙÐĵÄÊÂÇéÁË£¬²»¹ÜÎÒÁ©µÄÊÂÇ飬 ²»¹ý¼´Ê¹Èç´Ë£¬ËûÃǵĴúÂëÒ²¼«¶ÈµØ¼ò»¯ÁË£¬Ö»ÐèÒªÓøöatomic£¬¾ÍÄÜʵÏÖ°²È«µØ²¢·¢£¬ÊµÔÚÊÇ̫ˬÁË¡£”
Íú²ÆËµµÀ£º“Äã˵µÃÌ컨ÂÒ×¹£¬ÕâSTMÓÐʲôȱµã?”
ÀÏÍ·¶ù˵£º“ÌìÏÂûÓÐÃâ·ÑµÄÎç²Í£¬ºÜÈÝÒ×Ïëµ½STMµÄ¾ÖÏÞÐÔ£¬ Èç¹û¶ÔÓÚͬһ¸öÊý¾Ý£¬²¢·¢Ð´ÈëºÜ¶àµÄʱºò£¬³åÍ»¾Í´ó´óÔö¼ÓÁË£¬²»¶ÏµØÖظ´Ö´ÐУ¬Ð§Âʺܵ͡£ËùÒÔ¸üÊʺÏдÈëÉÙ£¬¶ÁÈ¡¶àµÄ³¡¾°¡£”
“ºÃ°É£¬ÎÒÃÇÕâ¾ÍÖ´ÐÐÕâ¸öתÕ˲Ù×÷£¬ÓÐÎÊÌâ¾ÍÕÒÄã!”
¡¾±¾ÎÄΪ51CTOרÀ¸×÷Õß“ÁõÐÀ”µÄÔ´´¸å¼þ£¬×ªÔØÇëͨ¹ý×÷Õß΢ÐŹ«ÖÚºÅcoderising»ñÈ¡ÊÚȨ¡¿
¡¾±à¼ÍƼö¡¿
µãÔÞ 0
- ´ó¼Ò¶¼ÔÚ¿´
- ²ÂÄãϲ»¶
-
ÁõÐÀ
¼Ü¹¹Ê¦
- ±¾ÖÜÅÅÐÐ
- ±¾ÔÂÅÅÐÐ
- ÔÚ°¢ÀïÒ»Ä꣬Îҵ߸²ÁËÔø¼áÐŲ»Òɵļ¼Êõ˼ά һƪ½²½â¡°·þÎñµ÷Óá±µÄÁ¼ÐÄÖ®×÷£¡ »¥ÁªÍø¹«Ë¾²»×ö¡°ÖÐ̨¡±»áËÀÂ𣿠KafkaÉè¼ÆÔÀí¿´ÁËÓÖÍü£¬ÍüÁËÓÖ¿´£¿ ÏÖ´úÍøÂ簲ȫ¼Ü¹¹Ó¦±¸¹¦ÄÜ
- ÐÑÐѰɣ¡ÓÖÒ»¸ö³ÌÐòÔ±ÔÚ¶«ÄÏÑdzöÊÂÁË... ¼¼ÊõÎÞ×AIÖ±½Ó¡°Íѵô¡±Å®ÐÔµÄÒ·þ£¡ ÎÒÊǼ¼Êõ×ܼ࣬ÎÒȷʵ´ð²»³öÄÇô¶à¼¼Êõϸ½Ú£¡ °¢Àï¼¼Êõ´óÅ££ºÒ»·Ý¼Ü¹¹Ê¦³ÉÉñ·Ïßͼ£¡ ÖÕÓÚÓÐÈ˰ÑÖÐ̨˵Çå³þÁË
ÊÓÆµ¿Î³Ì+¸ü¶à
-
2019Èí¿¼ÍøÂç¹æ»®Éè¼ÆÊ¦-×ÛºÏ֪ʶ¾«½²ÊÓÆµÅà
½²Ê¦£ºÐ¡ÈÎÀÏʦ352826ÈËѧϰ¹ý
-
2019ÄêÈí¿¼ÏµÍ³¼¯³ÉÏîÄ¿¹ÜÀí¹¤³Ìʦ--»ù´¡ÖªÊ¶
½²Ê¦£ºÐ¡ÈÎÀÏʦ233123ÈËѧϰ¹ý
-
RHCSA-RHCEÄ£Ä⿼ÊÔ»·¾³´î½¨ºÍ½â·¨ÊÓÆµ¿Î³Ì£¨
½²Ê¦£º¸ýÕñÔ´21952ÈËѧϰ¹ý