ÊÂʵ֤Ã÷£¬Òª·¢»Ó¶àºËÓ²¼þËù´øÀ´µÄÊÕÒæÊǺÜÀ§ÄѺÍÓзçÏյġ£µ±Ê¹Óò¢·¢ÕýÈ·ºÍ°²È«µØ±àд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Äܹ»·¢Ïֵĸü¶àȱÏÝÑùÀý£¬ÕâЩȱÏÝÄÑÒÔ±»·¢ÏÖ£¬µ«ºÜ¿ÉÄÜÊÇÔÖÄÑÐԵġ£ |