Java
ÓïÑÔÖÐµÄ volatile ±äÁ¿¿ÉÒÔ±»¿´×÷ÊÇÒ»ÖÖ ¡°³Ì¶È½ÏÇáµÄ synchronized¡±£»Óë synchronized
¿éÏà±È£¬volatile ±äÁ¿ËùÐèµÄ±àÂë½ÏÉÙ£¬²¢ÇÒÔËÐÐʱ¿ªÏúÒ²½ÏÉÙ£¬µ«ÊÇËüËùÄÜʵÏֵŦÄÜÒ²½öÊÇ synchronized
µÄÒ»²¿·Ö¡£±¾ÎĽéÉÜÁ˼¸ÖÖÓÐЧʹÓà volatile ±äÁ¿µÄģʽ£¬²¢Ç¿µ÷Á˼¸ÖÖ²»ÊʺÏʹÓà volatile
±äÁ¿µÄÇéÐΡ£
ËøÌṩÁËÁ½ÖÖÖ÷ÒªÌØÐÔ£º»¥³â£¨mutual exclusion£© ºÍ¿É¼ûÐÔ£¨visibility£©¡£»¥³â
¼´Ò»´ÎÖ»ÔÊÐíÒ»¸öÏ̳߳ÖÓÐij¸öÌØ¶¨µÄËø£¬Òò´Ë¿ÉʹÓøÃÌØÐÔʵÏÖ¶Ô¹²ÏíÊý¾ÝµÄе÷·ÃÎÊÐÒ飬ÕâÑù£¬Ò»´Î¾ÍÖ»ÓÐÒ»¸öÏß³ÌÄܹ»Ê¹Óøù²ÏíÊý¾Ý¡£¿É¼ûÐÔÒª¸ü¼Ó¸´ÔÓ
һЩ£¬Ëü±ØÐëÈ·±£ÊÍ·ÅËøÖ®Ç°¶Ô¹²ÏíÊý¾Ý×ö³öµÄ¸ü¸Ä¶ÔÓÚËæºó»ñµÃ¸ÃËøµÄÁíÒ»¸öÏß³ÌÊǿɼûµÄ ¡ª¡ª Èç¹ûûÓÐͬ²½»úÖÆÌṩµÄÕâÖֿɼûÐÔ±£Ö¤£¬Ï߳̿´µ½µÄ¹²Ïí±äÁ¿¿ÉÄÜÊÇÐÞ¸ÄǰµÄÖµ»ò²»Ò»ÖµÄÖµ£¬Õ⽫Òý·¢Ðí¶àÑÏÖØÎÊÌâ¡£
Volatile ±äÁ¿
Volatile ±äÁ¿¾ßÓÐ synchronized µÄ¿É¼ûÐÔÌØÐÔ£¬µ«ÊDz»¾ß±¸Ô×ÓÌØÐÔ¡£Õâ¾ÍÊÇ˵Ïß³ÌÄܹ»×Ô¶¯·¢ÏÖ
volatile ±äÁ¿µÄ×îÐÂÖµ¡£Volatile ±äÁ¿¿ÉÓÃÓÚÌṩḬ̈߳²È«£¬µ«ÊÇÖ»ÄÜÓ¦ÓÃÓڷdz£ÓÐÏÞµÄÒ»×éÓÃÀý£º¶à¸ö±äÁ¿Ö®¼ä»òÕßij¸ö±äÁ¿µÄµ±Ç°ÖµÓëÐ޸ĺóÖµÖ®¼äûÓÐÔ¼Êø¡£Òò´Ë£¬µ¥¶ÀʹÓÃ
volatile »¹²»×ãÒÔʵÏÖ¼ÆÊýÆ÷¡¢»¥³âËø»òÈκξßÓÐÓë¶à¸ö±äÁ¿Ïà¹ØµÄ²»±äʽ£¨Invariants£©µÄÀࣨÀýÈç
¡°start <=end¡±£©¡£
³öÓÚ¼òÒ×ÐÔ»ò¿ÉÉìËõÐԵĿ¼ÂÇ£¬Äú¿ÉÄÜÇãÏòÓÚʹÓà volatile ±äÁ¿¶ø²»ÊÇËø¡£µ±Ê¹ÓÃ
volatile ±äÁ¿¶ø·ÇËøÊ±£¬Ä³Ð©Ï°¹ßÓ÷¨£¨idiom£©¸ü¼ÓÒ×ÓÚ±àÂëºÍÔĶÁ¡£´ËÍ⣬volatile ±äÁ¿²»»áÏñËøÄÇÑùÔì³ÉÏß³Ì×èÈû£¬Òò´ËÒ²ºÜÉÙÔì³É¿ÉÉìËõÐÔÎÊÌâ¡£ÔÚijЩÇé¿öÏ£¬Èç¹û¶Á²Ù×÷Ô¶Ô¶´óÓÚд²Ù×÷£¬volatile
±äÁ¿»¹¿ÉÒÔÌṩÓÅÓÚËøµÄÐÔÄÜÓÅÊÆ¡£
ÕýȷʹÓà volatile ±äÁ¿µÄÌõ¼þ
ÄúÖ»ÄÜÔÚÓÐÏÞµÄһЩÇéÐÎÏÂʹÓà volatile ±äÁ¿Ìæ´úËø¡£ÒªÊ¹ volatile
±äÁ¿ÌṩÀíÏëµÄḬ̈߳²È«£¬±ØÐëͬʱÂú×ãÏÂÃæÁ½¸öÌõ¼þ£º
1.¶Ô±äÁ¿µÄд²Ù×÷²»ÒÀÀµÓÚµ±Ç°Öµ¡£
2.¸Ã±äÁ¿Ã»Óаüº¬ÔÚ¾ßÓÐÆäËû±äÁ¿µÄ²»±äʽÖС£
ʵ¼ÊÉÏ£¬ÕâЩÌõ¼þ±íÃ÷£¬¿ÉÒÔ±»Ð´Èë volatile ±äÁ¿µÄÕâЩÓÐЧֵ¶ÀÁ¢ÓÚÈκγÌÐòµÄ״̬£¬°üÀ¨±äÁ¿µÄµ±Ç°×´Ì¬¡£
µÚÒ»¸öÌõ¼þµÄÏÞÖÆÊ¹ volatile ±äÁ¿²»ÄÜÓÃ×÷Ḭ̈߳²È«¼ÆÊýÆ÷¡£ËäÈ»ÔöÁ¿²Ù×÷£¨x++£©¿´ÉÏÈ¥ÀàËÆÒ»¸öµ¥¶À²Ù×÷£¬Êµ¼ÊÉÏËüÊÇÒ»¸öÓɶÁÈ¡£Ð޸ģдÈë²Ù×÷ÐòÁÐ×é³ÉµÄ×éºÏ²Ù×÷£¬±ØÐëÒÔÔ×Ó·½Ê½Ö´ÐУ¬¶ø
volatile ²»ÄÜÌṩ±ØÐëµÄÔ×ÓÌØÐÔ¡£ÊµÏÖÕýÈ·µÄ²Ù×÷ÐèҪʹ x µÄÖµÔÚ²Ù×÷ÆÚ¼ä±£³Ö²»±ä£¬¶ø volatile
±äÁ¿ÎÞ·¨ÊµÏÖÕâµã¡££¨È»¶ø£¬Èç¹û½«Öµµ÷ÕûΪֻ´Óµ¥¸öÏß³ÌдÈ룬ÄÇô¿ÉÒÔºöÂÔµÚÒ»¸öÌõ¼þ¡££©
´ó¶àÊý±à³ÌÇéÐζ¼»áÓëÕâÁ½¸öÌõ¼þµÄÆäÖÐÖ®Ò»³åÍ»£¬Ê¹µÃ volatile ±äÁ¿²»ÄÜÏñ
synchronized ÄÇÑùÆÕ±éÊÊÓÃÓÚʵÏÖḬ̈߳²È«¡£Çåµ¥ 1 ÏÔʾÁËÒ»¸ö·ÇḬ̈߳²È«µÄÊýÖµ·¶Î§Àà¡£Ëü°üº¬ÁËÒ»¸ö²»±äʽ
¡ª¡ª Ͻç×ÜÊÇСÓÚ»òµÈÓÚÉϽ硣
Çåµ¥ 1. ·ÇḬ̈߳²È«µÄÊýÖµ·¶Î§Àà
@NotThreadSafe
public class NumberRange {
private int lower, upper;
public int getLower() { return lower; }
public int getUpper() { return upper; }
public void setLower(int value) {
if (value > upper)
throw new IllegalArgumentException(...);
lower = value;
}
public void setUpper(int value) {
if (value < lower)
throw new IllegalArgumentException(...);
upper = value;
}
} |
ÕâÖÖ·½Ê½ÏÞÖÆÁË·¶Î§µÄ״̬±äÁ¿£¬Òò´Ë½« lower ºÍ upper ×ֶζ¨ÒåΪ volatile ÀàÐͲ»Äܹ»³ä·ÖʵÏÖÀàµÄḬ̈߳²È«£»´Ó¶øÈÔÈ»ÐèҪʹÓÃͬ²½¡£·ñÔò£¬Èç¹û´ÕÇÉÁ½¸öÏß³ÌÔÚͬһʱ¼äʹÓò»Ò»ÖµÄÖµÖ´ÐÐ
setLower ºÍ setUpper µÄ»°£¬Ôò»áʹ·¶Î§´¦ÓÚ²»Ò»ÖµÄ״̬¡£ÀýÈ磬Èç¹û³õʼ״̬ÊÇ(0, 5)£¬Í¬Ò»Ê±¼äÄÚ£¬Ïß³Ì
A µ÷Óà setLower(4) ²¢ÇÒÏß³Ì B µ÷Óà setUpper(3)£¬ÏÔÈ»ÕâÁ½¸ö²Ù×÷½»²æ´æÈëµÄÖµÊDz»·ûºÏÌõ¼þµÄ£¬ÄÇôÁ½¸öÏ̶߳¼»áͨ¹ýÓÃÓÚ±£»¤²»±äʽµÄ¼ì²é£¬Ê¹µÃ×îºóµÄ·¶Î§ÖµÊÇ
(4, 3) ¡ª¡ª Ò»¸öÎÞЧֵ¡£ÖÁÓÚÕë¶Ô·¶Î§µÄÆäËû²Ù×÷£¬ÎÒÃÇÐèҪʹ setLower() ºÍsetUpper()
²Ù×÷Ô×Ó»¯ ¡ª¡ª ¶ø½«×ֶζ¨ÒåΪ volatile ÀàÐÍÊÇÎÞ·¨ÊµÏÖÕâһĿµÄµÄ¡£
ÐÔÄÜ¿¼ÂÇ
ʹÓà volatile ±äÁ¿µÄÖ÷ÒªÔÒòÊÇÆä¼òÒ×ÐÔ£ºÔÚijЩÇéÐÎÏ£¬Ê¹Óà volatile ±äÁ¿Òª±ÈʹÓÃÏàÓ¦µÄËø¼òµ¥µÃ¶à¡£Ê¹ÓÃ
volatile ±äÁ¿´ÎÒªÔÒòÊÇÆäÐÔÄÜ£ºÄ³Ð©Çé¿öÏ£¬volatile ±äÁ¿Í¬²½»úÖÆµÄÐÔÄÜÒªÓÅÓÚËø¡£
ºÜÄÑ×ö³ö׼ȷ¡¢È«ÃæµÄÆÀ¼Û£¬ÀýÈç ¡°X ×ÜÊÇ±È Y ¿ì¡±£¬ÓÈÆäÊÇ¶Ô JVM ÄÚÔڵIJÙ×÷¶øÑÔ¡££¨ÀýÈ磬ijЩÇé¿öÏÂ
VM Ò²ÐíÄܹ»Íêȫɾ³ýËø»úÖÆ£¬ÕâʹµÃÎÒÃÇÄÑÒÔ³éÏóµØ±È½Ï volatile ºÍ synchronized
µÄ ¿ªÏú¡££©¾ÍÊÇ˵£¬ÔÚĿǰ´ó¶àÊýµÄ´¦ÀíÆ÷¼Ü¹¹ÉÏ£¬volatile ¶Á²Ù×÷¿ªÏú·Ç³£µÍ ¡ª¡ª ¼¸ºõºÍ·Ç volatile
¶Á²Ù×÷Ò»Ñù¡£¶ø volatile д²Ù×÷µÄ¿ªÏúÒª±È·Ç volatile д²Ù×÷¶àºÜ¶à£¬ÒòΪҪ±£Ö¤¿É¼ûÐÔÐèҪʵÏÖÄÚ´æ½ç¶¨£¨Memory
Fence£©£¬¼´±ãÈç´Ë£¬volatile µÄ×Ü¿ªÏúÈÔȻҪ±ÈËø»ñÈ¡µÍ¡£
volatile ²Ù×÷²»»áÏñËøÒ»ÑùÔì³É×èÈû£¬Òò´Ë£¬ÔÚÄܹ»°²È«Ê¹Óà volatile µÄÇé¿öÏ£¬volatile
¿ÉÒÔÌṩһЩÓÅÓÚËøµÄ¿ÉÉìËõÌØÐÔ¡£Èç¹û¶Á²Ù×÷µÄ´ÎÊýÒªÔ¶Ô¶³¬¹ýд²Ù×÷£¬ÓëËøÏà±È£¬volatile ±äÁ¿Í¨³£Äܹ»¼õÉÙͬ²½µÄÐÔÄÜ¿ªÏú¡£
ÕýȷʹÓà volatile µÄģʽ
ºÜ¶à²¢·¢ÐÔר¼ÒÊÂʵÉÏÍùÍùÒýµ¼Óû§Ô¶Àë volatile ±äÁ¿£¬ÒòΪʹÓÃËüÃÇÒª±ÈʹÓÃËø¸ü¼ÓÈÝÒ׳ö´í¡£È»¶ø£¬Èç¹û½÷É÷µØ×ñÑһЩÁ¼ºÃ¶¨ÒåµÄģʽ£¬¾ÍÄܹ»ÔںܶೡºÏÄÚ°²È«µØÊ¹ÓÃ
volatile ±äÁ¿¡£ÒªÊ¼ÖÕÀμÇʹÓà volatile µÄÏÞÖÆ ¡ª¡ª Ö»ÓÐÔÚ×´Ì¬ÕæÕý¶ÀÁ¢ÓÚ³ÌÐòÄÚÆäËûÄÚÈÝʱ²ÅÄÜʹÓÃ
volatile ¡ª¡ª ÕâÌõ¹æÔòÄܹ»±ÜÃ⽫ÕâЩģʽÀ©Õ¹µ½²»°²È«µÄÓÃÀý¡£
ģʽ #1£º×´Ì¬±êÖ¾
Ò²ÐíʵÏÖ volatile ±äÁ¿µÄ¹æ·¶Ê¹Óýö½öÊÇʹÓÃÒ»¸ö²¼¶û״̬±êÖ¾£¬ÓÃÓÚָʾ·¢ÉúÁËÒ»¸öÖØÒªµÄÒ»´ÎÐÔʼþ£¬ÀýÈçÍê³É³õʼ»¯»òÇëÇóÍ£»ú¡£
ºÜ¶àÓ¦ÓóÌÐò°üº¬ÁËÒ»ÖÖ¿ØÖƽṹ£¬ÐÎʽΪ ¡°ÔÚ»¹Ã»ÓÐ×¼±¸ºÃÍ£Ö¹³ÌÐòʱÔÙÖ´ÐÐһЩ¹¤×÷¡±£¬ÈçÇåµ¥ 2 Ëùʾ£º
Çåµ¥ 2. ½« volatile ±äÁ¿×÷Ϊ״̬±ê־ʹÓÃ
volatile boolean shutdownRequested;
...
public void shutdown() { shutdownRequested = true; }
public void doWork() {
while (!shutdownRequested) {
// do stuff
}
} |
ºÜ¿ÉÄÜ»á´ÓÑ»·Íⲿµ÷Óà shutdown() ·½·¨ ¡ª¡ª ¼´ÔÚÁíÒ»¸öÏß³ÌÖÐ ¡ª¡ª Òò´Ë£¬ÐèÒªÖ´ÐÐijÖÖͬ²½À´È·±£ÕýȷʵÏÖ
shutdownRequested ±äÁ¿µÄ¿É¼ûÐÔ¡££¨¿ÉÄÜ»á´Ó JMX ÕìÌý³ÌÐò¡¢GUI ʼþÏß³ÌÖеIJÙ×÷ÕìÌý³ÌÐò¡¢Í¨¹ý
RMI ¡¢Í¨¹ýÒ»¸ö Web ·þÎñµÈµ÷Óã©¡£È»¶ø£¬Ê¹Óà synchronized¿é±àдѻ·Òª±ÈʹÓÃÇåµ¥ 2
ËùʾµÄ volatile ״̬±êÖ¾±àдÂé·³ºÜ¶à¡£ÓÉÓÚ volatile ¼ò»¯Á˱àÂ룬²¢ÇÒ״̬±êÖ¾²¢²»ÒÀÀµÓÚ³ÌÐòÄÚÈÎºÎÆäËû״̬£¬Òò´Ë´Ë´¦·Ç³£ÊʺÏʹÓÃ
volatile¡£
ÕâÖÖÀàÐ͵Ä״̬±ê¼ÇµÄÒ»¸ö¹«¹²ÌØÐÔÊÇ£ºÍ¨³£Ö»ÓÐÒ»ÖÖ״̬ת»»£»shutdownRequested ±êÖ¾´Ó
false ת»»Îª true£¬È»ºó³ÌÐòÍ£Ö¹¡£ÕâÖÖģʽ¿ÉÒÔÀ©Õ¹µ½À´»Ø×ª»»µÄ״̬±êÖ¾£¬µ«ÊÇÖ»ÓÐÔÚת»»ÖÜÆÚ²»±»²ì¾õµÄÇé¿öϲÅÄÜÀ©Õ¹£¨´Ó
false µ½ true£¬ÔÙת»»µ½ false£©¡£´ËÍ⣬»¹ÐèҪijЩÔ×Ó״̬ת»»»úÖÆ£¬ÀýÈçÔ×Ó±äÁ¿¡£
ģʽ #2£ºÒ»´ÎÐÔ°²È«·¢²¼£¨one-time safe publication£©
ȱ·¦Í¬²½»áµ¼ÖÂÎÞ·¨ÊµÏֿɼûÐÔ£¬ÕâʹµÃÈ·¶¨ºÎʱдÈë¶ÔÏóÒýÓöø²»ÊÇÔÓïÖµ±äµÃ¸ü¼ÓÀ§ÄÑ¡£ÔÚȱ·¦Í¬²½µÄÇé¿öÏ£¬¿ÉÄÜ»áÓöµ½Ä³¸ö¶ÔÏóÒýÓõĸüÐÂÖµ£¨ÓÉÁí
Ò»¸öÏß³ÌдÈ룩ºÍ¸Ã¶ÔÏó״̬µÄ¾Éֵͬʱ´æÔÚ¡££¨Õâ¾ÍÊÇÔì³ÉÖøÃûµÄË«ÖØ¼ì²éËø¶¨£¨double-checked-locking£©ÎÊÌâµÄ¸ùÔ´£¬ÆäÖжÔÏóÒýÓÃ
ÔÚûÓÐͬ²½µÄÇé¿öϽøÐжÁ²Ù×÷£¬²úÉúµÄÎÊÌâÊÇÄú¿ÉÄܻῴµ½Ò»¸ö¸üеÄÒýÓ㬵«ÊÇÈÔÈ»»áͨ¹ý¸ÃÒýÓÿ´µ½²»ÍêÈ«¹¹ÔìµÄ¶ÔÏ󣩡£
ʵÏÖ°²È«·¢²¼¶ÔÏóµÄÒ»ÖÖ¼¼Êõ¾ÍÊǽ«¶ÔÏóÒýÓö¨ÒåΪ volatile ÀàÐÍ¡£Çåµ¥ 3 չʾÁËÒ»¸öʾÀý£¬ÆäÖкǫ́Ïß³ÌÔÚÆô¶¯½×¶Î´ÓÊý¾Ý¿â¼ÓÔØÒ»Ð©Êý¾Ý¡£ÆäËû´úÂëÔÚÄܹ»ÀûÓÃÕâЩÊý¾Ýʱ£¬ÔÚʹÓÃ֮ǰ½«¼ì²éÕâЩÊý¾ÝÊÇ·ñÔø¾·¢²¼¹ý¡£
Çåµ¥ 3. ½« volatile ±äÁ¿ÓÃÓÚÒ»´ÎÐÔ°²È«·¢²¼
public class BackgroundFloobleLoader {
public volatile Flooble theFlooble;
public void initInBackground() {
// do lots of stuff
theFlooble = new Flooble(); // this is the only write to theFlooble
}
}
public class SomeOtherClass {
public void doWork() {
while (true) {
// do some stuff...
// use the Flooble, but only if it is ready
if (floobleLoader.theFlooble != null)
doSomething(floobleLoader.theFlooble);
}
}
} |
Èç¹û theFlooble ÒýÓò»ÊÇ volatile ÀàÐÍ£¬doWork() ÖеĴúÂëÔÚ½â³ý¶Ô theFlooble
µÄÒýÓÃʱ£¬½«»áµÃµ½Ò»¸ö²»ÍêÈ«¹¹ÔìµÄ Flooble¡£
¸ÃģʽµÄÒ»¸ö±ØÒªÌõ¼þÊÇ£º±»·¢²¼µÄ¶ÔÏó±ØÐëÊÇḬ̈߳²È«µÄ£¬»òÕßÊÇÓÐЧµÄ²»¿É±ä¶ÔÏó£¨ÓÐЧ²»¿É±äÒâζ×ŶÔÏóµÄ״̬ÔÚ·¢²¼Ö®ºóÓÀÔ¶²»»á±»Ð޸ģ©¡£volatile
ÀàÐ͵ÄÒýÓÿÉÒÔÈ·±£¶ÔÏóµÄ·¢²¼ÐÎʽµÄ¿É¼ûÐÔ£¬µ«ÊÇÈç¹û¶ÔÏóµÄ״̬ÔÚ·¢²¼ºó½«·¢Éú¸ü¸Ä£¬ÄÇô¾ÍÐèÒª¶îÍâµÄͬ²½¡£
ģʽ #3£º¶ÀÁ¢¹Û²ì£¨independent observation£©
°²È«Ê¹Óà volatile µÄÁíÒ»ÖÖ¼òµ¥Ä£Ê½ÊÇ£º¶¨ÆÚ ¡°·¢²¼¡± ¹Û²ì½á¹û¹©³ÌÐòÄÚ²¿Ê¹Óá£ÀýÈ磬¼ÙÉèÓÐÒ»ÖÖ»·¾³´«¸ÐÆ÷Äܹ»¸Ð¾õ»·¾³Î¶ȡ£Ò»¸öºǫ́Ï߳̿ÉÄÜ»áÿ¸ô¼¸Ãë¶Áȡһ´Î¸Ã´«¸ÐÆ÷£¬²¢¸üаüº¬µ±Ç°ÎĵµµÄ
volatile ±äÁ¿¡£È»ºó£¬ÆäËûÏ߳̿ÉÒÔ¶ÁÈ¡Õâ¸ö±äÁ¿£¬´Ó¶øËæÊ±Äܹ»¿´µ½×îеÄζÈÖµ¡£
ʹÓøÃģʽµÄÁíÒ»ÖÖÓ¦ÓóÌÐò¾ÍÊÇÊÕ¼¯³ÌÐòµÄͳ¼ÆÐÅÏ¢¡£Çåµ¥ 4 չʾÁËÉí·ÝÑéÖ¤»úÖÆÈçºÎ¼ÇÒä×î½üÒ»´ÎµÇ¼µÄÓû§µÄÃû×Ö¡£½«·´¸´Ê¹ÓÃlastUser
ÒýÓÃÀ´·¢²¼Öµ£¬ÒÔ¹©³ÌÐòµÄÆäËû²¿·ÖʹÓá£
Çåµ¥ 4. ½« volatile ±äÁ¿ÓÃÓÚ¶à¸ö¶ÀÁ¢¹Û²ì½á¹ûµÄ·¢²¼
public class UserManager {
public volatile String lastUser;
public boolean authenticate(String user, String password) {
boolean valid = passwordIsValid(user, password);
if (valid) {
User u = new User();
activeUsers.add(u);
lastUser = user;
}
return valid;
}
} |
¸ÃģʽÊÇÇ°ÃæÄ£Ê½µÄÀ©Õ¹£»½«Ä³¸öÖµ·¢²¼ÒÔÔÚ³ÌÐòÄ򵀮äËûµØ·½Ê¹Ó㬵«ÊÇÓëÒ»´ÎÐÔʼþµÄ·¢²¼²»Í¬£¬ÕâÊÇһϵÁжÀÁ¢Ê¼þ¡£Õâ¸öģʽҪÇó±»·¢²¼µÄÖµÊÇÓÐЧ²»¿É±äµÄ
¡ª¡ª ¼´ÖµµÄ״̬ÔÚ·¢²¼ºó²»»á¸ü¸Ä¡£Ê¹ÓøÃÖµµÄ´úÂëÐèÒªÇå³þ¸ÃÖµ¿ÉÄÜËæÊ±·¢Éú±ä»¯¡£
ģʽ #4£º¡°volatile bean¡± ģʽ
volatile bean ģʽÊÊÓÃÓÚ½« JavaBeans ×÷Ϊ¡°ÈÙÓþ½á¹¹¡±Ê¹ÓõĿò¼Ü¡£ÔÚ volatile
bean ģʽÖУ¬JavaBean ±»ÓÃ×÷Ò»×é¾ßÓÐ getter ºÍ/»ò setter ·½·¨ µÄ¶ÀÁ¢ÊôÐÔµÄÈÝÆ÷¡£volatile
bean ģʽµÄ»ù±¾ÔÀíÊÇ£ººÜ¶à¿ò¼ÜΪÒ×±äÊý¾ÝµÄ³ÖÓÐÕߣ¨ÀýÈç HttpSession£©ÌṩÁËÈÝÆ÷£¬µ«ÊÇ·ÅÈëÕâЩÈÝÆ÷ÖеĶÔÏó±ØÐëÊÇḬ̈߳²È«µÄ¡£
ÔÚ volatile bean ģʽÖУ¬JavaBean µÄËùÓÐÊý¾Ý³ÉÔ±¶¼ÊÇ volatile ÀàÐ͵쬲¢ÇÒ
getter ºÍ setter ·½·¨±ØÐë·Ç³£ÆÕͨ ¡ª¡ª ³ýÁË»ñÈ¡»òÉèÖÃÏàÓ¦µÄÊôÐÔÍ⣬²»Äܰüº¬ÈκÎÂß¼¡£´ËÍ⣬¶ÔÓÚ¶ÔÏóÒýÓõÄÊý¾Ý³ÉÔ±£¬ÒýÓõĶÔÏó±ØÐëÊÇÓÐЧ²»¿É±äµÄ¡££¨Õ⽫½ûÖ¹¾ßÓÐÊý×éÖµµÄÊôÐÔ£¬ÒòΪµ±Êý×é
ÒýÓñ»ÉùÃ÷Ϊ volatile ʱ£¬Ö»ÓÐÒýÓöø²»ÊÇÊý×é±¾Éí¾ßÓÐ volatile ÓïÒ壩¡£¶ÔÓÚÈκΠvolatile
±äÁ¿£¬²»±äʽ»òÔ¼Êø¶¼²»Äܰüº¬ JavaBean ÊôÐÔ¡£Çåµ¥ 5 ÖеÄʾÀýչʾÁË×ñÊØ volatile bean
ģʽµÄ JavaBean£º
Çåµ¥ 5. ×ñÊØ volatile bean ģʽµÄ Person ¶ÔÏó
@ThreadSafe
public class Person {
private volatile String firstName;
private volatile String lastName;
private volatile int age;
public String getFirstName() { return firstName; }
public String getLastName() { return lastName; }
public int getAge() { return age; }
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public void setAge(int age) {
this.age = age;
}
} |
volatile µÄ¸ß¼¶Ä£Ê½
Ç°Ãæ¼¸½Ú½éÉܵÄģʽº¸ÇÁ˴󲿷ֵĻù±¾ÓÃÀý£¬ÔÚÕâЩģʽÖÐʹÓà volatile ·Ç³£ÓÐÓò¢ÇÒ¼òµ¥¡£ÕâÒ»½Ú½«½éÉÜÒ»ÖÖ¸ü¼Ó¸ß¼¶µÄģʽ£¬ÔÚ¸ÃģʽÖУ¬volatile
½«ÌṩÐÔÄÜ»ò¿ÉÉìËõÐÔÓÅÊÆ¡£
volatile Ó¦Óõĵĸ߼¶Ä£Ê½·Ç³£´àÈõ¡£Òò´Ë£¬±ØÐë¶Ô¼ÙÉèµÄÌõ¼þ×Ðϸ֤Ã÷£¬²¢ÇÒÕâЩģʽ±»ÑϸñµØ·â×°ÁËÆðÀ´£¬ÒòΪ¼´Ê¹·Ç³£Ð¡µÄ¸ü¸ÄÒ²»áËð»µÄúµÄ´úÂ룡ͬÑù£¬Ê¹Óøü¸ß¼¶
µÄ volatile ÓÃÀýµÄÔÒòÊÇËüÄܹ»ÌáÉýÐÔÄÜ£¬È·±£ÔÚ¿ªÊ¼Ó¦Óø߼¶Ä£Ê½Ö®Ç°£¬ÕæÕýÈ·¶¨ÐèҪʵÏÖÕâÖÖÐÔÄÜ»ñÒæ¡£ÐèÒª¶ÔÕâЩģʽ½øÐÐȨºâ£¬·ÅÆú¿É¶ÁÐÔ»ò¿Éά»¤ÐÔÀ´»»È¡¿ÉÄܵÄÐÔ
ÄÜÊÕÒæ ¡ª¡ª Èç¹ûÄú²»ÐèÒªÌáÉýÐÔÄÜ£¨»òÕß²»Äܹ»Í¨¹ýÒ»¸öÑϸñµÄ²âÊÔ³ÌÐòÖ¤Ã÷ÄúÐèÒªËü£©£¬ÄÇôÕâºÜ¿ÉÄÜÊÇÒ»´ÎÔã¸âµÄ½»Ò×£¬ÒòΪÄúºÜ¿ÉÄÜ»áµÃ²»³¥Ê§£¬»»À´µÄ¶«Î÷Òª±È·ÅÆúµÄ
¶«Î÷¼ÛÖµ¸üµÍ¡£
ģʽ #5£º¿ªÏú½ÏµÍµÄ¶Á£Ð´Ëø²ßÂÔ
ĿǰΪֹ£¬ÄúÓ¦¸ÃÁ˽âÁË volatile µÄ¹¦ÄÜ»¹²»×ãÒÔʵÏÖ¼ÆÊýÆ÷¡£ÒòΪ ++x ʵ¼ÊÉÏÊÇÈýÖÖ²Ù×÷£¨¶Á¡¢Ìí¼Ó¡¢´æ´¢£©µÄ¼òµ¥×éºÏ£¬Èç¹û¶à¸öÏ̴߳ÕÇÉÊÔͼͬʱ¶Ô
volatile ¼ÆÊýÆ÷Ö´ÐÐÔöÁ¿²Ù×÷£¬ÄÇôËüµÄ¸üÐÂÖµÓпÉÄܻᶪʧ¡£
È»¶ø£¬Èç¹û¶Á²Ù×÷Ô¶Ô¶³¬¹ýд²Ù×÷£¬Äú¿ÉÒÔ½áºÏʹÓÃÄÚ²¿ËøºÍ volatile ±äÁ¿À´¼õÉÙ¹«¹²´úÂë·¾¶µÄ¿ªÏú¡£Çåµ¥
6 ÖÐÏÔʾµÄḬ̈߳²È«µÄ¼ÆÊýÆ÷ʹÓÃsynchronized È·±£ÔöÁ¿²Ù×÷ÊÇÔ×ӵ쬲¢Ê¹Óà volatile
±£Ö¤µ±Ç°½á¹ûµÄ¿É¼ûÐÔ¡£Èç¹û¸üв»Æµ·±µÄ»°£¬¸Ã·½·¨¿ÉʵÏÖ¸üºÃµÄÐÔÄÜ£¬ÒòΪ¶Á·¾¶µÄ¿ªÏú½ö½öÉæ¼° volatile
¶Á²Ù×÷£¬Õâͨ³£ÒªÓÅÓÚÒ»¸öÎÞ¾ºÕùµÄËø»ñÈ¡µÄ¿ªÏú¡£
Çåµ¥ 6. ½áºÏʹÓà volatile ºÍ synchronized ʵÏÖ ¡°¿ªÏú½ÏµÍµÄ¶Á£Ð´Ëø¡±
@ThreadSafe
public class CheesyCounter {
// Employs the cheap read-write lock trick
// All mutative operations MUST be done with the 'this' lock held
@GuardedBy("this") private volatile int value;
public int getValue() { return value; }
public synchronized int increment() {
return value++;
}
} |
Ö®ËùÒÔ½«ÕâÖÖ¼¼Êõ³ÆÖ®Îª ¡°¿ªÏú½ÏµÍµÄ¶Á£Ð´Ëø¡± ÊÇÒòΪÄúʹÓÃÁ˲»Í¬µÄͬ²½»úÖÆ½øÐжÁд²Ù×÷¡£ÒòΪ±¾ÀýÖеÄд²Ù×÷Î¥·´ÁËʹÓÃ
volatile µÄµÚÒ»¸öÌõ¼þ£¬Òò´Ë²»ÄÜʹÓà volatile °²È«µØÊµÏÖ¼ÆÊýÆ÷ ¡ª¡ª Äú±ØÐëʹÓÃËø¡£È»¶ø£¬Äú¿ÉÒÔÔÚ¶Á²Ù×÷ÖÐʹÓÃ
volatile È·±£µ±Ç°ÖµµÄ¿É¼ûÐÔ£¬ Òò´Ë¿ÉÒÔʹÓÃËø½øÐÐËùÓб仯µÄ²Ù×÷£¬Ê¹Óà volatile ½øÐÐÖ»¶Á²Ù×÷¡£ÆäÖУ¬ËøÒ»´ÎÖ»ÔÊÐíÒ»¸öÏ̷߳ÃÎÊÖµ£¬volatile
ÔÊÐí¶à¸öÏß³ÌÖ´ÐжÁ²Ù×÷£¬Òò´Ëµ±Ê¹Óà volatile ±£Ö¤¶Á´úÂë·¾¶Ê±£¬Òª±ÈʹÓÃËøÖ´ÐÐÈ«²¿´úÂë·¾¶»ñµÃ¸ü¸ßµÄ¹²Ïí¶È
¡ª¡ª ¾ÍÏñ¶Á£Ð´²Ù×÷Ò»Ñù¡£È»¶ø£¬ÒªËæÊ±ÀμÇÕâÖÖģʽµÄÈõµã£ºÈç¹û³¬Ô½Á˸ÃģʽµÄ×î»ù±¾Ó¦Ó㬽áºÏÕâÁ½¸ö¾ºÕùµÄͬ²½»úÖÆ½«±äµÃ·Ç³£À§ÄÑ¡£
½áÊøÓï
ÓëËøÏà±È£¬Volatile ±äÁ¿ÊÇÒ»Öַdz£¼òµ¥µ«Í¬Ê±Óַdz£´àÈõµÄͬ²½»úÖÆ£¬ËüÔÚijЩÇé¿öϽ«ÌṩÓÅÓÚËøµÄÐÔÄܺÍÉìËõÐÔ¡£Èç¹ûÑϸñ×ñÑ
volatile µÄʹÓÃÌõ¼þ ¡ª¡ª ¼´±äÁ¿ÕæÕý¶ÀÁ¢ÓÚÆäËû±äÁ¿ºÍ×Ô¼ºÒÔǰµÄÖµ ¡ª¡ª ÔÚijЩÇé¿öÏ¿ÉÒÔʹÓÃ
volatile ´úÌæ synchronized À´¼ò»¯´úÂ롣Ȼ¶ø£¬Ê¹Óà volatile µÄ´úÂëÍùÍù±ÈʹÓÃËøµÄ´úÂë¸ü¼ÓÈÝÒ׳ö´í¡£±¾ÎĽéÉܵÄģʽº¸ÇÁË¿ÉÒÔʹÓÃ
volatile ´úÌæ synchronized µÄ×î³£¼ûµÄһЩÓÃÀý¡£×ñÑÕâЩģʽ£¨×¢ÒâʹÓÃʱ²»Òª³¬¹ý¸÷×ÔµÄÏÞÖÆ£©¿ÉÒÔ°ïÖúÄú°²È«µØÊµÏÖ´ó¶àÊýÓÃÀý£¬Ê¹ÓÃ
volatile ±äÁ¿»ñµÃ¸ü¼ÑÐÔÄÜ¡£
|