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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʹÓÃContemplate ThreadSafe·¢ÏÖ²¢ÅжÏJava²¢·¢ÎÊÌâ
 
»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-06-06
 

ÊÂʵ֤Ã÷£¬Òª·¢»Ó¶àºËÓ²¼þËù´øÀ´µÄÊÕÒæÊǺÜÀ§ÄѺÍÓзçÏյġ£µ±Ê¹Óò¢·¢ÕýÈ·ºÍ°²È«µØ±àдJavaÈí¼þʱ£¬ÎÒÃÇÐèÒªºÜ×ÐϸµØ½øÐÐ˼¿¼¡£ÒòΪ´íÎóʹÓò¢·¢»áµ¼ÖÂż¶û²Å³öÏÖµÄȱÏÝ£¬ÕâЩȱÏÝÉõÖÁÄܹ»¶ã¹ý×îÑϸñµÄ²âÊÔ»·¾³¡£

¾²Ì¬·ÖÎö¹¤¾ßÌṩÁËÒ»ÖÖ·½Ê½£¬¿ÉÒÔÔÚ´úÂëÖ´ÐÐ֮ǰ̽²é²¢ÐÞÕý²¢·¢´íÎó¡£ËüÄܹ»ÔÚ´úÂëÖ´ÐÐ֮ǰ·ÖÎö³ÌÐòµÄÔ´Âë»ò±àÒëÐγɵÄ×Ö½ÚÂ룬½ø¶ø·¢ÏÖÒþ²ØÔÚ´úÂëÖ®ÖеÄȱÏÝ¡£

ContemplateµÄThreadSafe SoloÊÇÒ»¸öÉÌÓõÄEclipse¾²Ì¬·ÖÎö²å¼þ£¬ÆäÄ¿µÄ¾ÍÊÇרÃÅÓÃÀ´·¢ÏÖ²¢Õï¶ÏÒþ²ØÔÚJava³ÌÐòÖ®ÖеÄȱÏÝ¡£ÒòΪרעÓÚ²¢·¢·½ÃæµÄȱÏÝ£¬ËùÒÔThreadSafeÄܹ»·¢ÏÖÆäËûÉÌÓûòÃâ·Ñ¾²Ì¬·ÖÎö¹¤¾ßÎÞ·¨·¢ÏÖµÄȱÏÝ£¬ÕâЩ¹¤¾ßͨ³£»áºöÊÓÕâÖÖȱÏÝ»òÕ߸ù±¾¾Í²»ÊÇΪÁ˲éÕÒÕâÖÖȱÏݶøÉè¼ÆµÄ¡£¾ÍĿǰÎÒÃÇËùÄÜÈ·¶¨µÄ£¬ÆäËûµÄJava¾²Ì¬·ÖÎö¹¤¾ß¶¼²»Äܲ¶»ñÒÔÏÂÑùÀýÖеÄÈκÎȱÏÝ¡£ÔÚ±¾ÎÄÖУ¬ÎÒ»áͨ¹ýһϵÁв¢·¢È±ÏÝÀ´½éÉÜThreadSafe£¬ÕâЩ¶¼ÊǾßÌåµÄÑùÀýºÍʵ¼ÊµÄOSS´úÂ룬ÕâÀïÕ¹ÏÖÁËThreadSafeµÄ¸ß¼¶¾²Ì¬·ÖÎöÒÔ¼°ÓëEclipseµÄ½ôÃܼ¯³É£¬ÕâÑùÎÒÃǾÍÄÜÔÚ´úÂë²úÆ·»¯Ö®Ç°£¬¼°Ôç·¢ÏÖ²¢Õï¶ÏÕâЩȱÏÝ¡£Èç¹ûÏëÔÚÄãµÄ´úÂëÉÏÌåÑéThreadSafeµÄ»°£¬¿ÉÒÔÔÚContemplateÕ¾µãÉÏÏÂÔØÃâ·ÑÊÔÓð汾¡£

ÔÚ±¾ÎÄÖÐ×÷ΪÑùÀýËùʹÓõIJ¢·¢È±Ïݶ¼ÊÇÓÉÓÚ¿ª·¢ÈËԱûÓÐÕýÈ·µØÍ¬²½¶Ô¹²ÏíÊý¾ÝµÄ·ÃÎÊËùÒýÆðµÄ¡£ÕâÀàȱÏÝͬʱÊÇJava´úÂëÖÐ×î³£¼ûµÄ²¢·¢È±ÏÝÐÎʽ£¬Ò²ÊÇÔÚ´úÂë¼ì²éºÍ²âÊÔÖÐ×îÄÑ̽²éµÄȱÏÝÖ®Ò»¡£ThreadSafeÄܹ»Ì½²â³öÖÚ¶àûÓÐÕýȷʹÓÃͬ²½µÄ³¡¾°£¬ÈçÏÂÎÄËùÊö£¬Ëüͬʱ»¹ÄÜΪ¿ª·¢ÈËÔ±ÌṩÖÁ¹ØÖØÒªµÄÉÏÏÂÎÄÐÅÏ¢£¬´Ó¶øÓÐÖúÓÚ¶ÔÎÊÌâ×ö³öÕï¶Ï¡£

Ô­±¾ÕýÈ·µÄͬ²½Ëæ×Åʱ¼äµÄÍÆÒÆ±äµÃ²»ÕýÈ·ÁË

Èç¹ûÒ»¸öÀàµÄʵÀý»á±»¶à¸öÏ̲߳¢·¢µ÷Óã¬ÄÇôÔÚÉè¼ÆµÄʱºò£¬¿ª·¢ÈËÔ±±ØÐëÒª×Ðϸ¿¼ÂÇÈçºÎ¶Ôͬһ¸öʵÀý½øÐв¢·¢·ÃÎÊ£¬ÒÔ±£Ö¤Äܹ»ÕýÈ·µØ½øÐд¦Àí¡£¼´±ãÕÒµ½Á˺õÄÉè¼Æ·½°¸£¬Ò²ºÜÄѱ£Ö¤Õâ¸ö¾­¹ý×ÐϸÉè¼ÆµÄͬ²½Ð­ÒéÔÚ½«À´Ìí¼Ó´úÂëʱÄܹ»µÃµ½³ä·ÖµÄ×ðÖØ¡£µ±Ð±àдµÄ´úÂëÎ¥·´ÒÑÓеIJ¢·¢Éè¼ÆÊ±£¬ThreadSafeÄܹ»°ïÖúÖ¸³öÕâЩ³¡¾°¡£

¶ÔÓÚ¼òµ¥µÄͬ²½ÈÎÎñ£¬JavaÌṩÁ˶àÖÖ²»Í¬µÄ»ù´¡ÉèÊ©£¬°üÀ¨synchronized¹Ø¼ü×ÖÒÔ¼°¸üΪÁé»îµÄjava.util.concurrent.locks°ü¡£

×÷Ϊһ¸ö¼òµ¥Ê¾Àý£¬ÎÒÃÇʹÓÃJavaÄÚÖõÄͬ²½ÉèÊ©À´°²È«²¢·¢µØ·ÃÎʹ²Ïí×ÊÔ´£¬¿¼ÂÇÈçϵĴúÂëÆ¬¶Î£¬ÊµÏÖÁËÄ£ÄâµÄ¡°ÒøÐÐÕË»§¡±Àà¡£

public class BankAccount {

   protected final Object lock = new Object();

   private int balance;

   protected int readBalance() {
       return balance;
   }

   protected void adjustBalance(int adjustment) {
       balance = balance + adjustment;
   }

   // ... methods that synchronize on "lock" while calling
   // readBalance() or adjustBalance(..)

}

Õâ¸öÀàµÄ¿ª·¢ÈËÔ±¾ö¶¨Í¨¹ýÁ½¸öÄÚ²¿µÄAPI·½·¨£¬¼´readBalance()ºÍadjustBalance()£¬À´¶ÔbalanceÓòÌṩ·ÃÎʹ¦ÄÜ¡£ÕâЩ·½·¨¸ø¶¨ÁËprotected¼¶±ðµÄ¿É¼ûÐÔ£¬ËùÒÔËüÃÇ¿ÉÄܻᱻBankAccountµÄ×ÓÀà·ÃÎÊ¡£¼øÓÚÔÚBankAccountʵÀýÉÏÈκζÔÍⱩ¶µÄÌØ¶¨²Ù×÷¶¼»áÉæ¼°µ½¶ÔÕâЩ·½·¨½øÐÐһϵÁи´Ôӵĵ÷Óã¬ÕâЩ·½·¨Ó¦¸Ã×÷Ϊһ¸öÔ­×ӵIJ½ÖèÀ´Ö´ÐУ¬¶øÄÚ²¿µÄAPI·½·¨±¾Éí²¢²»½øÐÐÈκεÄͬ²½¡£Ïà·´£¬ÕâЩ·½·¨µÄµ÷ÓÃÕßҪͬ²½lockÓòÖÐËù´æ´¢µÄ¶ÔÏó£¬ÒÔ±£Ö¤»¥³âÐÔÒÔ¼°¶ÔbalanceÓò¸üеÄÔ­×ÓÐÔ¡£

ÔÚ³ÌÐò¹æÄ£ºÜСµÄʱºò£¬³ÌÐòµÄÉè¼Æ¿ÉÒÔ×°ÔÚij¸ö¿ª·¢ÈËÔ±µÄÄÔ×ÓÖУ¬³öÏÖ²¢·¢Ïà¹ØÎÊÌâµÄ·çÏÕÏà¶ÔÀ´½²»á±È½ÏС¡£µ«ÊÇ£¬ÔÚʵ¼ÊµÄÏîÄ¿ÖУ¬×î³õ¾«ÐÄÉè¼ÆµÄ³ÌÐòÐèÒª½øÐÐÀ©Õ¹ÒÔÊÊÓ¦ÐµĹ¦ÄÜ£¬¶øÕâͨ³£ÊÇÓÉÏîÄ¿µÄй¤³ÌʦÀ´Íê³ÉµÄ¡£

ÏÖÔÚ£¬¼ÙÉèÔÚ×î³õµÄ´úÂë±àдһ¶Îʱ¼äÖ®ºó£¬ÁíÍâÒ»¸ö¿ª·¢ÈËÔ±±àдÁËBankAccountµÄ×ÓÀàÀ´Ìí¼ÓһЩеĿÉÑ¡¹¦ÄÜ¡£ÁîÈËÒź¶µÄÊÇ£¬Õâ¸öеĿª·¢ÈËÔ±²¢²»Ò»¶¨Á˽â֮ǰµÄ¿ª·¢ÈËÔ±ËùÉè¼ÆºÃµÄͬ²½»úÖÆ£¬Ëû²¢Ã»ÓÐÒâʶµ½Èç¹ûûÓÐÔ¤ÏÈͬ²½±£´æÔÚlockÓòÖеĶÔÏó£¬ÊDz»Äܵ÷ÓÃreadBalance()ºÍadjustBalance(..)µÄ¡£

й¤³ÌʦËù±àдµÄBankAccount×ÓÀà´úÂë¿ÉÄÜ»áÈçÏÂËùʾ£º

public class BonusBankAccount extends BankAccount {

    private final int bonus;

    public BonusBankAccount(int initialBalance, int bonus) {
        super(initialBalance);

        if (bonus < 0)
            throw new IllegalArgumentException("bonus must be >= 0");

        this.bonus = bonus;
    }

    public void applyBonus() {
        adjustBalance(bonus);
    }
}

ÔÚapplyBonus()µÄʵÏÖÖдæÔÚ×ÅÎÊÌ⡣ΪÁËÕýÈ·µØ×ñÑ­BankAccountÀàµÄͬ²½²ßÂÔ£¬applyBonus()ÔÚµ÷ÓÃadjustBalance()ʱӦ¸Ãͬ²½lock¡£²»¹ý£¬ÕâÀïûÓÐÖ´ÐÐͬ²½£¬ËùÒÔBonusBankAccountµÄ×÷ÕßÔÚÕâÀïÒýÈëÁËÒ»¸öÑÏÖØµÄ²¢·¢È±ÏÝ¡£

¾¡¹ÜÕâ¸öȱÏݺÜÑÏÖØ£¬µ«ÊÇÔÚ²âÊÔÉõÖÁÉú²ú½×¶ÎҪ̽²âµ½ËüÈ´ÊǺÜÀ§Äѵġ£Õâ¸öȱÏݵıíÏÖÐÎʽΪ²»Ò»ÖµÄÕË»§Óà¶î£¬ÕâÊÇÓÉÓÚȱÉÙͬ²½»áµ¼ÖÂij¸öÏ̶߳ÔbalanceÓòµÄ¸üÐÂ¶ÔÆäËûÏß³ÌÊDz»¿É¼ûµÄ¡£Õâ¸öȱÏݲ»»áµ¼Ö³ÌÐò±ÀÀ££¬µ«ÊÇ»áÒÔÄÑÒÔ¸ú×ٵķ½Ê½£¬Ä¬Ä¬µØ²úÉú²»Ò»ÖµĽá¹û¡£ÔÚËĺ˵ÄÓ²¼þÉÏ£¬³¢ÊÔÒÔËĸöÏ̲߳¢·¢µØ¶Ôͬһ¸öÕË»§½øÐзµÏֺʹû³ö²Ù×÷£¬ÔÚ40,000¸öÊÂÎñÖлáÓÐ11¸öÊÇʧЧµÄ¡£

ThreadSafe¿ÉÒÔÓÃÀ´Ê¶±ðÀàËÆÓÚBonusBankAccountÀàËùÒýÈëµÄ²¢·¢È±ÏÝ¡£ÔÚÉÏÃæÌáµ½µÄÁ½¸öÀàÉÏÔËÐÐThreadSafeµÄEclipse²å¼þ£¬»á²úÉúÈçϵÄÊä³ö£º

ÔÚEclipseÖУ¬ThreadSafeÊÓͼµÄ½ØÆÁ

Õâ¸ö½ØÆÁÏÔʾThreadSafeÒѾ­·¢ÏÖbalanceÓòûÓнøÐÐÒ»ÖµÄͬ²½¡£

Òª»ñÈ¡¸ü¶àµÄÉÏÏÂÎÄÐÅÏ¢£¬¿ÉÒÔÈÃThreadSafeÏÔʾ¶ÔbalanceÓòµÄ·ÃÎÊ£¬Ëü»¹»áΪÎÒÃÇÕ¹ÏÖÿ´Î·ÃÎÊËù³ÖÓеÄËø£º

ThreadSafe AccessesÊÓͼµÄ½ØÆÁ

ͨ¹ýÕâ¸öÊÓͼ£¬ÎÒÃÇ¿ÉÒÔÇå³þµØ¿´µ½ÔÚadjustBalance()·½·¨ÖжÔbalanceÓòûÓнøÐÐÒ»ÖÂÐÔµÄͬ²½¡£Ê¹ÓÃEclipseµÄµ÷Óò㼶£¨call hierarchy£©ÊÓͼ£¨ÔÚÕâÀï¿ÉÒÔͨ¹ýÓÒ¼üµã»÷ÊÓͼÖÐadjustBalance()ÕâÒ»ÐпìËÙ·ÃÎÊ£©£¬ÎÒÃÇ¿ÉÒÔ¿´µ½Õâ¸öÌÖÑáµÄ´úÂë·¾¶ÊÇÔõÑù²úÉúµÄ¡£

Eclipseµ÷Óò㼶µÄ½ØÆÁ£¬Õ¹ÏÖÁËBonusBankAccount¶ÔadjustBalance·½·¨µÄµ÷ÓÃ

·ÃÎʼ¯ºÏʱ£¬²»ÕýÈ·µÄͬ²½

ÉÏÃæÌáµ½µÄBankAccountÀàÊÇÒ»¸öºÜ¼òµ¥µÄÀý×Ó£¬Õ¹ÏÖÁË·ÃÎÊÓòʱûÓнøÐÐÕýÈ·µÄͬ²½¡£µ±È»£¬´ó¶àÊýJava¶ÔÏó¶¼ÊÇÓÉÆäËû¶ÔÏó×é³ÉµÄ£¬³£¼ûµÄ±íÏÖÐÎʽ¾ÍÊǶÔÏ󼯺ϡ£JavaÌṩÁËÖÖÀà·±¶àµÄ¼¯ºÏÀ࣬µ±¶Ô¼¯ºÏ½øÐв¢·¢·ÃÎÊʱ£¬Ã¿Ò»¸ö¼¯ºÏÀà¶¼ÓÐÆäÊÇ·ñÐèÒª½øÐÐͬ²½µÄÐèÇó¡£

¶Ô¼¯ºÏµÄ²»Ò»ÖÂͬ²½¿ÉÄÜ»á¶Ô³ÌÐòµÄÐÐΪ´øÀ´ÌرðÑÏÖØµÄÓ°Ïì¡£µ±¶ÔÒ»¸öÓòµÄ·ÃÎÊûÓÐÕýÈ·µÄͬ²½Ê±£¬¿ÉÄÜ¡°Ö»ÊÇ¡±¶ªÊ§¸üлòʹÓùýÆÚÊý¾Ý£¬¶øÓÐЩ¼¯ºÏÔ­±¾²¢Ã»ÓÐÉè¼Æ³ÉÖ§³Ö²¢·¢Ê¹Ó㬶ÔÕâЩ¼¯ºÏµÄ²»Ò»ÖÂͬ²½Ôò¿ÉÄÜ»áÎ¥·´¼¯ºÏÄÚ²¿µÄ²»±äÐΣ¨invariants£©¡£Èç¹ûÎ¥·´Á˼¯ºÏµÄÄÚ²¿²»±äÐοÉÄܲ¢²»»áÂíÉϳöÏֿɼûÐÔµÄÎÊÌ⣬µ«ÊÇ¿ÉÄܻᵼÖºܹîÒìµÄÐÐΪ£¬±ÈÈçÔÚ³ÌÐòµÄºóÐøÖ´ÐÐÖлá³öÏÖÎÞÏÞÑ­»·»òÊý¾ÝË𻵡£

µ±·ÃÎʹ²ÏíµÄ¼¯ºÏʱ£¬²»Ò»ÖµØÊ¹ÓÃͬ²½µÄÑùÀý³öÏÖÔÚApache JMeterÖ®ÖУ¬ÕâÊÇÒ»¸öºÜÁ÷ÐеIJâÊÔÓ¦ÓÃÔÚ¸ºÔØÏÂÐÔÄܵĿªÔ´¹¤¾ß¡£ÔÚ2.1.0°æ±¾µÄApache JMeterÉÏÔËÐÐThreadSafe»á²úÉúÈçϵľ¯¸æ£º

´æ´¢ÔÚRespTimeGraphVisualizer.internalList : List<RespTimeGraphDataBean>ÓòÖеļ¯ºÏÒòΪ²»Ò»ÖÂͬ²½¶ø²úÉúµÄ¾¯¸æ½ØÆÁ

ÏñÇ°ÃæÒ»Ñù£¬ÎÒÃÇ¿ÉÒÔÒªÇóThreadSafeÕ¹ÏÖÕâ¸ö±¨¸æµÄ¸ü¶àÐÅÏ¢£¬°üÀ¨¶ÔÕâ¸öÓòµÄ·ÃÎÊÒÔ¼°ËüËù³ÖÓеÄËø£º

̽²éinternalListµÄThreadSafe AccessesÊÓͼµÄ½ØÆÁ

ÏÖÔÚÎÒÃÇ¿ÉÒÔ¿´µ½ÓÐÈý¸ö·½·¨·ÃÎÊ´æ´¢ÔÚinternalListÓòÖеļ¯ºÏ¡£ÆäÖÐÓÐÒ»¸ö·½·¨ÊÇactionPerformed£¬Ëü½«»áÓÉSwing Gui¿ò¼ÜÔÚUIÏß³ÌÉϵ÷Óá£

ÁíÍâÒ»¸ö·ÃÎÊinternalListËù´æ´¢¼¯ºÏµÄ·½·¨ÊÇadd()¡£Í¬ÑùµÄ£¬Ì½²éÕâ¸ö·½·¨¿ÉÄܵĵ÷ÓÃÕߣ¬ÎÒÃǻᷢÏÖËüȷʵ»áÓÉÒ»¸öÏ̵߳Ärun()À´µ÷Ó㬶øÕâ¸öÏ̲߳¢²»ÊÇÓ¦ÓõÄUIỊ̈߳¬Õâ±íÃ÷Ó¦¸ÃҪʹÓÃͬ²½¡£

EclipseµÄµ÷Óò㼶½á¹¹½ØÆÁ£¬Õ¹ÏÖÁËrun()·½·¨

µ±Ê¹ÓÃAndroid¿ò¼Üʱ£¬È±ÉÙͬ²½

Ó¦ÓóÌÐòÔËÐÐʱËùÔڵIJ¢·¢»·¾³Í¨³£²¢²»ÔÚÓ¦Óÿª·¢ÈËÔ±µÄ¿ØÖÆÖ®Ï¡£¿ò¼Ü»áµ÷Óø÷¸ö²¿·ÖÀ´ÏìÓ¦Óû§¡¢ÍøÂç»òÆäËûµÄÍⲿʼþ£¬Í¨³£À´½²Ä³¸ö·½·¨Äܱ»ÄÄÌõÏß³ÌÀ´µ÷Óö¼ÓÐÄÚÔÚµÄÐèÇó¡£

δÕýȷʹÓÿò¼ÜµÄÒ»¸öÑùÀý¿ÉÒÔÔÚGit°æ±¾µÄAndroid email¿Í»§¶ËK9MailÉÏÕÒµ½£¨ÔÚ±¾ÎĵĽáβ´¦£¬ÎÒÃÇÌṩÁËËù²âÊÔ°æ±¾µÄÁ´½Ó£©¡£ÔÚK9MailÉÏÔËÐÐThreadSafe»áµÃµ½Èçϵľ¯¸æ£¬±íÃ÷mDraftIdÓò»á±»AndroidµÄºǫ́½ø³ÌÒÔ¼°ÁíÍâÒ»¸ö½ø³ÌËù·ÃÎÊ£¬µ«ÊÇûÓнøÐÐͬ²½¡£

Õë¶ÔÒì²½»Øµ÷·½·¨µÄδͬ²½·ÃÎÊ£¬ThreadSafeËù²úÉúµÄ±¨¸æ

ʹÓÃThreadSafeµÄAccessesÊÓͼ£¬ÎÒÃÇ¿ÉÒÔ¿´µ½mDraftIdÓò»á±»ÃûΪdoInBackgroundµÄ·½·¨Ëù·ÃÎÊ¡£

ThreadSafeµÄAccessesÊÓͼչÏÖÁ˶ÔmDraftIdµÄÿ¸ö·ÃÎÊ

doInBackground·½·¨ÊÇAndroid¿ò¼ÜAsyncTask»ù´¡ÉèÊ©µÄÒ»²¿·Ö£¬ËüÓÃÀ´ÔÚºǫִ́ÐкÄʱµÄÈÎÎñ£¬ÕâÊÇÓëÖ÷UIÏß³ÌÏà·ÖÀëµÄ¡£ÕýȷʹÓÃAsyncTask.doInBackground(..)Äܹ»±£Ö¤¶ÔÓû§µÄÊäÈë±£³ÖÏìÓ¦£¬µ«ÊDZØÐëҪעÒâµÄÊǺǫ́Ïß³ÌÓëÖ÷UIÏß³ÌÖ®¼äµÄ½»»¥±ØÐëÒªÕýÈ·µØÍ¬²½¡£

½øÒ»²½½øÐÐ̽²é£¬Ê¹ÓÃEclipseµÄµ÷Óò㼶½á¹¹ÊÓͼ£¬ÎÒÃǻᷢÏÖonDiscard()·½·¨£¬Õâ¸ö·½·¨Ò²·ÃÎÊÁËmDraftIdÓò£¬Õâ¸ö·½·¨ÊDZ»onBackPressed()Ëùµ÷Óõġ£¶øÕâ¸ö·½·¨Í¨³£ÊÇÓÉAndroid¿ò¼ÜÔÚÖ÷Ïß³ÌÖе÷Óõ쬲¢²»ÊÇÔËÐÐAsyncTasksµÄºǫ́Ị̈߳¬Õâ¾Í±íÃ÷ÕâÀï»áÓÐÒ»¸öDZÔڵIJ¢·¢È±ÏÝ¡£

²»ÕýÈ·µØÊ¹ÓÃͬ²½µÄÊý¾Ý½á¹¹

¶ÔÓÚÏà¶Ô¼òµ¥³¡¾°£¬JavaÄÚÖõÄͬ²½¼¯ºÏ¾ÍÌṩÁ˺ÏÊʵÄḬ̈߳²È«ÐÔ¹¦ÄÜ£¬ÎÞÐèÎÒÃÇ·ÑÌ«¶à¹¦·ò¡£

ͬ²½¼¯ºÏ¶ÔÔ­Óеļ¯ºÏÀà½øÐÐÁ˰ü×°£¬ÌṩÁËÓëµ×²ã¼¯ºÏÏàͬµÄ½Ó¿Ú£¬µ«ÊǶÔͬ²½¼¯ºÏʵÀýµÄËùÓзÃÎʶ¼½øÐÐÁËͬ²½¡£Í¬²½¼¯ºÏҪͨ¹ýµ÷ÓÃÌØ¶¨µÄ¾²Ì¬·½·¨À´»ñµÃ£¬ÀàËÆµÄµ÷Ó÷½Ê½ÈçÏÂËùʾ£º

private List<X> threadSafeList =
Collections.synchronizedList(new LinkedList<X>());

Ïà¶ÔÓÚÆäËûḬ̈߳²È«µÄÊý¾Ý½á¹¹£¬Í¬²½¼¯ºÏʹÓÃÆðÀ´ºÜÈÝÒ×£¬µ«ÊÇÔÚËüÃǵÄʹÓÃÖÐÒ²ÓкÜ΢ÃîµÄÏÝÚå¡£ÔÚʹÓÃͬ²½¼¯ºÏʱ£¬Ò»¸ö³£¼ûµÄ´íÎó¾ÍÊÇÔÚûÓÐͬ²½¼¯ºÏ±¾ÉíµÄÇé¿öÏ£¬¶ÔËüÃǽøÐбéÀú¡£¼øÓÚûÓÐÇ¿ÖÆÒªÇó¶Ô¼¯ºÏ½øÐÐÅÅËûÐԵķÃÎÊ£¬ËùÒÔÔÚµü´úÆäÔªËØµÄʱºò£¬¼¯ºÏ¿ÉÄܻᱻÆäËûµÄÏß³ÌÐ޸ġ£Õâ¿ÉÄܻᵼÖ¼äЪÐÔµØÅ׳öConcurrentModificationException£¬»òÕß³öÏÖÎÞ·¨Ô¤ÖªµÄÐÐΪ£¬ÕâÈ¡¾öÓÚÏ̵߳ľßÌåµ÷¶È¡£Í¬²½µÄÐèÇóÃ÷È·¼Ç¼ÔÚJDK APIÎĵµÖ®ÖУº

µ±¶Ô·µ»ØµÄlist½øÐбéÀúµÄʱºò£¬Óû§±ØÐëÊÖ¶¯µØ¶ÔÆä½øÐÐͬ²½£º
List list = Collections.synchronizedList(new ArrayList());
...
synchronized (list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
²»×ñÑ­¸Ã½¨ÒéµÄ»°¿ÉÄܻᵼÖÂÎÞ·¨Ô¤ÖªµÄÐÐΪ

¾¡¹ÜÈç´Ë£¬µ±µü´úÒ»¸öͬ²½¼¯ºÏʱ£¬»¹ÊǺÜÈÝÒ×Íü¼Ç½øÐÐͬ²½µÄ£¬ÓÈÆäÊÇËüÃÇÓë³£¹æµÄ·Çͬ²½¼¯ºÏÓÐ×ÅÏàͬµÄ½Ó¿Ú¡£

ÔÚ2.10°æ±¾µÄApache JMeterÖ®ÖУ¬¿ÉÒÔ¿´µ½ÕâÖÖ´íÎóµÄÑùÀý¡£ThreadSafe±¨¸æÁËÈçÏ¡°¶Ôͬ²½¼¯ºÏµÄ²»°²È«±éÀú¡±³¡¾°£º

ThreadSafeËù²úÉúµÄ±¨¸æ²»°²È«±éÀúµÄ½ØÆÁ

ThreadSafe±¨¸æµÄÄÇÒ»ÐÐÖаüº¬ÁËÈçϵĴúÂ룺

Iterator<Map.Entry<String, JMeterProperty>> iter = propMap.entrySet().iterator();

ÔÚÕâÀµü´úÊÇ»ùÓÚÒ»¸öͬ²½¼¯ºÏµÄÊÓͼ£¨view£©½øÐеģ¬ËüÊÇͨ¹ýµ÷ÓÃentrySet()µÃµ½µÄ¡£ÒòΪ¼¯ºÏµÄÊÓͼÊÇ¡°»îÔ¾µÄ£¨live£©¡±£¬Òò´ËÕâ¶Î´úÂëͬÑù¿ÉÄܲúÉúÉÏÎÄËùÊöµÄÎÞ·¨Ô¤ÖªÐÐΪ»òConcurrentModificationException¡£

½áÂÛ

ÎÒÕ¹ÏÖÁËһС²¿·Ö²¢·¢Ïà¹ØµÄȱÏÝ£¬ÕâЩ¶¼ÊÇÔÚʵ¼ÊµÄJava³ÌÐòÖкܳ£¼ûµÄ£¬²¢ÇÒÑÝʾÁËContemplate ThreadSafeÄܹ»ÈçºÎ°ïÖúÎÒÃÇ·¢ÏÖ²¢Õï¶ÏËüÃÇ¡£

×ÜÌå¶øÑÔ£¬²»¹ÜÊÇÒÑÓеϹÊÇбàдµÄJava´úÂ룬¾²Ì¬·ÖÎö¹¤¾ß¶¼ÄÜÓÐÖúÓÚ·¢ÏÖÒþ²ØÔÚ´úÂëÖ®ÖеÄȱÏÝ¡£¾²Ì¬·ÖÎöÄܹ»¶Ô´«Í³µÄÈí¼þÖÊÁ¿¼¼ÊõÐγɲ¹³ä£¬ÕâЩ´«Í³µÄ¼¼Êõ°üÀ¨²âÊԺʹúÂëÉó²é£¬¾²Ì¬·ÖÎöÌṩÁËÒ»ÖÖ¿ì½ÝÇÒ¿ÉÖØ¸´µÄ·½Ê½À´É¨Ãè´úÂ룬ĿµÄÔÚÓÚ·¢ÏÖһЩΪ´ó¼ÒËùÊìÖªµ«ÊDZȽÏÄÑÒÔ·¢ÏÖÇÒÑÏÖØµÄȱÏÝ¡£²¢·¢µÄȱÏÝÓÈÆäÄÑÒÔÔÚ²âÊÔÖкܿɿ¿µÄ·¢ÏÖ£¬ÒòΪËüÃÇÒÀÀµÓÚ²»È·¶¨µÄ²¢·¢Ï̵߳÷¶È¡£

ThreadSafe»¹ÄÜ·¢ÏÖÆäËûһϵÁеIJ¢·¢È±ÏÝ£¬°üÀ¨ÒòΪ²»ÕýÈ·µØÊ¹Óò¢·¢¼¯ºÏ¿ò¼ÜËùÒýÆðµÄÔ­×ÓÐÔ´íÎóÒÔ¼°´íÎóʹÓÃ×èÈû·½·¨¿ÉÄÜÒýÆðµÄËÀËø¡£ThreadSafeµÄ¼¼Êõ×ÊÁÏÒÔ¼°ÑùÀýÊÓÆµÖÐչʾÁËThreadSafeÄܹ»·¢Ïֵĸü¶àȱÏÝÑùÀý£¬ÕâЩȱÏÝÄÑÒÔ±»·¢ÏÖ£¬µ«ºÜ¿ÉÄÜÊÇÔÖÄÑÐԵġ£

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

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

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

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


Java ÖеÄÖÐÎıàÂëÎÊÌâ
Java»ù´¡ÖªÊ¶µÄÈýÊ®¸ö¾­µäÎÊ´ð
Íæ×ª Java Web Ó¦Óÿª·¢
ʹÓÃSpring¸üºÃµØ´¦ÀíStruts
ÓÃEclipse¿ª·¢iPhone WebÓ¦ÓÃ
²å¼þϵͳ¿ò¼Ü·ÖÎö


Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ


Struts+Spring+Hibernate/EJB+ÐÔÄÜÓÅ»¯
»ªÏÄ»ù½ð ActiveMQ Ô­ÀíÓë¹ÜÀí
ijÃñº½¹«Ë¾ Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢
ij·çµç¹«Ë¾ Java Ó¦Óÿª·¢Æ½Ì¨ÓëÇ¨ÒÆ
ÈÕÕÕ¸Û J2EEÓ¦Óÿª·¢¼¼Êõ¿ò¼ÜÓëʵ¼ù
ij¿ç¹ú¹«Ë¾ ¹¤×÷Á÷¹ÜÀíJBPM
¶«·½º½¿Õ¹«Ë¾ ¸ß¼¶J2EE¼°ÆäÇ°ÑØ¼¼Êõ