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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Java ÀíÂÛÓëʵ¼ù: ÕýȷʹÓà Volatile ±äÁ¿
 
À´Ô´£º51CTO ·¢²¼ÓÚ 2015-5-25
  2280  次浏览      27
 

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 ±äÁ¿»ñµÃ¸ü¼ÑÐÔÄÜ¡£

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

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

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

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

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¼°ÆäÇ°ÑØ¼¼Êõ