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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
´Ó¸ùÔ´ÉϽâÎö Java volatile ¹Ø¼ü×ÖµÄʵÏÖ
 
À´Ô´£ºÂëÅ©Íø ·¢²¼ÓÚ 2016-10-14
  3882  次浏览      28
 

1¡¢½âÎö¸ÅÀÀ

a.ÄÚ´æÄ£Ð͵ÄÏà¹Ø¸ÅÄî

b.²¢·¢±à³ÌÖеÄÈý¸ö¸ÅÄî

c.JavaÄÚ´æÄ£ÐÍ

d.ÉîÈëÆÊÎöVolatile¹Ø¼ü×Ö

e.ʹÓÃvolatile¹Ø¼ü×ֵij¡¾°

2¡¢ÄÚ´æÄ£Ð͵ÄÏà¹Ø¸ÅÄî

»º´æÒ»ÖÂÐÔÎÊÌ⡣ͨ³£³ÆÕâÖÖ±»¶à¸öÏ̷߳ÃÎʵıäÁ¿Îª¹²Ïí±äÁ¿¡£

Ò²¾ÍÊÇ˵£¬Èç¹ûÒ»¸ö±äÁ¿ÔÚ¶à¸öCPUÖж¼´æÔÚ»º´æ£¨Ò»°ãÔÚ¶àÏ̱߳à³Ìʱ²Å»á³öÏÖ£©£¬ÄÇô¾Í¿ÉÄÜ´æÔÚ»º´æ²»Ò»ÖµÄÎÊÌâ¡£

ΪÁ˽â¾ö»º´æ²»Ò»ÖÂÐÔÎÊÌ⣬ͨ³£À´ËµÓÐÒÔÏÂ2ÖÖ½â¾ö·½·¨£º

a.ͨ¹ýÔÚ×ÜÏß¼ÓLOCK#ËøµÄ·½Ê½

b.ͨ¹ý»º´æÒ»ÖÂÐÔЭÒé

Õâ2ÖÖ·½Ê½¶¼ÊÇÓ²¼þ²ãÃæÉÏÌṩµÄ·½Ê½¡£

ÉÏÃæµÄ·½Ê½1»áÓÐÒ»¸öÎÊÌ⣬ÓÉÓÚÔÚËø×¡×ÜÏßÆÚ¼ä£¬ÆäËûCPUÎÞ·¨·ÃÎÊÄڴ棬µ¼ÖÂЧÂʵÍÏ¡£

»º´æÒ»ÖÂÐÔЭÒé¡£×î³öÃûµÄ¾ÍÊÇIntel µÄMESIЭÒ飬MESIЭÒé±£Ö¤ÁËÿ¸ö»º´æÖÐʹÓõĹ²Ïí±äÁ¿µÄ¸±±¾ÊÇÒ»Öµġ£ËüºËÐĵÄ˼ÏëÊÇ£ºµ±CPUдÊý¾Ýʱ£¬Èç¹û·¢ÏÖ²Ù×÷µÄ±äÁ¿Êǹ²Ïí±äÁ¿£¬¼´ÔÚÆäËûCPUÖÐÒ²´æÔڸñäÁ¿µÄ¸±±¾£¬»á·¢³öÐźÅ֪ͨÆäËûCPU½«¸Ã±äÁ¿µÄ»º´æÐÐÖÃΪÎÞЧ״̬£¬Òò´Ëµ±ÆäËûCPUÐèÒª¶ÁÈ¡Õâ¸ö±äÁ¿Ê±£¬·¢ÏÖ×Ô¼º»º´æÖлº´æ¸Ã±äÁ¿µÄ»º´æÐÐÊÇÎÞЧµÄ£¬ÄÇôËü¾Í»á´ÓÄÚ´æÖØÐ¶ÁÈ¡¡£

3¡¢²¢·¢±à³ÌÖеÄÈý¸ö¸ÅÄî

ÔÚ²¢·¢±à³ÌÖУ¬ÎÒÃÇͨ³£»áÓöµ½ÒÔÏÂÈý¸öÎÊÌ⣺ԭ×ÓÐÔÎÊÌ⣬¿É¼ûÐÔÎÊÌ⣬ÓÐÐòÐÔÎÊÌâ¡£

3.1 Ô­×ÓÐÔ

Ô­×ÓÐÔ£º¼´Ò»¸ö²Ù×÷»òÕß¶à¸ö²Ù×÷ Ҫôȫ²¿Ö´Ðв¢ÇÒÖ´ÐеĹý³Ì²»»á±»ÈκÎÒòËØ´ò¶Ï£¬ÒªÃ´¾Í¶¼²»Ö´ÐС£

3.2 ¿É¼ûÐÔ

¿É¼ûÐÔÊÇÖ¸µ±¶à¸öÏ̷߳ÃÎÊͬһ¸ö±äÁ¿Ê±£¬Ò»¸öÏß³ÌÐÞ¸ÄÁËÕâ¸ö±äÁ¿µÄÖµ£¬ÆäËûÏß³ÌÄܹ»Á¢¼´¿´µÃµ½Ð޸ĵÄÖµ¡£

3.3 ÓÐÐòÐÔ

ÓÐÐòÐÔ£º¼´³ÌÐòÖ´ÐеÄ˳Ðò°´ÕÕ´úÂëµÄÏȺó˳ÐòÖ´ÐС£

´Ó´úÂë˳ÐòÉÏ¿´£¬Óï¾ä1ÊÇÔÚÓï¾ä2Ç°ÃæµÄ£¬ÄÇôJVMÔÚÕæÕýÖ´ÐÐÕâ¶Î´úÂëµÄʱºò»á±£Ö¤Óï¾ä1Ò»¶¨»áÔÚÓï¾ä2Ç°ÃæÖ´ÐÐÂ𣿲»Ò»¶¨£¬ÎªÊ²Ã´ÄØ£¿ÕâÀï¿ÉÄܻᷢÉúÖ¸ÁîÖØÅÅÐò£¨Instruction Reorder£©¡£

ÏÂÃæ½âÊÍÒ»ÏÂʲôÊÇÖ¸ÁîÖØÅÅÐò£¬Ò»°ãÀ´Ëµ£¬´¦ÀíÆ÷ΪÁËÌá¸ß³ÌÐòÔËÐÐЧÂÊ£¬¿ÉÄÜ»á¶ÔÊäÈë´úÂë½øÐÐÓÅ»¯£¬Ëü²»±£Ö¤³ÌÐòÖи÷¸öÓï¾äµÄÖ´ÐÐÏȺó˳Ðòͬ´úÂëÖеÄ˳ÐòÒ»Ö£¬µ«ÊÇËü»á±£Ö¤³ÌÐò×îÖÕÖ´Ðнá¹ûºÍ´úÂë˳ÐòÖ´ÐеĽá¹ûÊÇÒ»Öµġ£

Ö¸ÁîÖØÅÅÐò²»»áÓ°Ïìµ¥¸öÏ̵߳ÄÖ´ÐУ¬µ«ÊÇ»áÓ°Ïìµ½Ï̲߳¢·¢Ö´ÐеÄÕýÈ·ÐÔ¡£

Ò²¾ÍÊÇ˵£¬ÒªÏë²¢·¢³ÌÐòÕýÈ·µØÖ´ÐУ¬±ØÐëÒª±£Ö¤Ô­×ÓÐÔ¡¢¿É¼ûÐÔÒÔ¼°ÓÐÐòÐÔ¡£Ö»ÒªÓÐÒ»¸öûÓб»±£Ö¤£¬¾ÍÓпÉÄܻᵼÖ³ÌÐòÔËÐв»ÕýÈ·¡£

4¡¢JavaÄÚ´æÄ£ÐÍ

ÔÚJavaÐéÄâ»ú¹æ·¶ÖÐÊÔͼ¶¨ÒåÒ»ÖÖJavaÄÚ´æÄ£ÐÍ£¨Java Memory Model£¬JMM£©À´ÆÁ±Î¸÷¸öÓ²¼þƽ̨ºÍ²Ù×÷ϵͳµÄÄÚ´æ·ÃÎʲîÒ죬ÒÔʵÏÖÈÃJava³ÌÐòÔÚ¸÷ÖÖÆ½Ì¨Ï¶¼ÄÜ´ïµ½Ò»ÖµÄÄÚ´æ·ÃÎÊЧ¹û¡£ÄÇôJavaÄÚ´æÄ£Ð͹涨ÁËÄÄЩ¶«Î÷ÄØ£¬Ëü¶¨ÒåÁ˳ÌÐòÖбäÁ¿µÄ·ÃÎʹæÔò£¬Íù´óÒ»µã˵ÊǶ¨ÒåÁ˳ÌÐòÖ´ÐеĴÎÐò¡£×¢Ò⣬ΪÁË»ñµÃ½ÏºÃµÄÖ´ÐÐÐÔÄÜ£¬JavaÄÚ´æÄ£ÐͲ¢Ã»ÓÐÏÞÖÆÖ´ÐÐÒýÇæÊ¹Óô¦ÀíÆ÷µÄ¼Ä´æÆ÷»òÕ߸ßËÙ»º´æÀ´ÌáÉýÖ¸ÁîÖ´ÐÐËÙ¶È£¬Ò²Ã»ÓÐÏÞÖÆ±àÒëÆ÷¶ÔÖ¸Áî½øÐÐÖØÅÅÐò¡£Ò²¾ÍÊÇ˵£¬ÔÚjavaÄÚ´æÄ£ÐÍÖУ¬Ò²»á´æÔÚ»º´æÒ»ÖÂÐÔÎÊÌâºÍÖ¸ÁîÖØÅÅÐòµÄÎÊÌâ¡£

JavaÄÚ´æÄ£Ð͹涨ËùÓеıäÁ¿¶¼ÊÇ´æÔÚÖ÷´æµ±ÖУ¨ÀàËÆÓÚÇ°ÃæËµµÄÎïÀíÄڴ棩£¬Ã¿¸öÏ̶߳¼ÓÐ×Ô¼ºµÄ¹¤×÷Äڴ棨ÀàËÆÓÚÇ°ÃæµÄ¸ßËÙ»º´æ£©¡£Ï̶߳ԱäÁ¿µÄËùÓвÙ×÷¶¼±ØÐëÔÚ¹¤×÷ÄÚ´æÖнøÐУ¬¶ø²»ÄÜÖ±½Ó¶ÔÖ÷´æ½øÐвÙ×÷¡£²¢ÇÒÿ¸öÏ̲߳»ÄÜ·ÃÎÊÆäËûÏ̵߳Ť×÷ÄÚ´æ¡£

4.1 Ô­×ÓÐÔ

ÔÚJavaÖУ¬¶Ô»ù±¾Êý¾ÝÀàÐ͵ıäÁ¿µÄ¶ÁÈ¡ºÍ¸³Öµ²Ù×÷ÊÇÔ­×ÓÐÔ²Ù×÷£¬¼´ÕâЩ²Ù×÷ÊDz»¿É±»Öжϵģ¬ÒªÃ´Ö´ÐУ¬ÒªÃ´²»Ö´ÐС£

Çë·ÖÎöÒÔÏÂÄÄЩ²Ù×÷ÊÇÔ­×ÓÐÔ²Ù×÷£º

x = 10; //Óï¾ä1

y = x; //Óï¾ä2

x++; //Óï¾ä3

x = x + 1; //Óï¾ä4

ÆäʵֻÓÐÓï¾ä1ÊÇÔ­×ÓÐÔ²Ù×÷£¬ÆäËûÈý¸öÓï¾ä¶¼²»ÊÇÔ­×ÓÐÔ²Ù×÷¡£

Ò²¾ÍÊÇ˵£¬Ö»Óмòµ¥µÄ¶ÁÈ¡¡¢¸³Öµ£¨¶øÇÒ±ØÐëÊǽ«Êý×Ö¸³Öµ¸øÄ³¸ö±äÁ¿£¬±äÁ¿Ö®¼äµÄÏ໥¸³Öµ²»ÊÇÔ­×Ó²Ù×÷£©²ÅÊÇÔ­×Ó²Ù×÷¡£

´ÓÉÏÃæ¿ÉÒÔ¿´³ö£¬JavaÄÚ´æÄ£ÐÍÖ»±£Ö¤ÁË»ù±¾¶ÁÈ¡ºÍ¸³ÖµÊÇÔ­×ÓÐÔ²Ù×÷£¬Èç¹ûҪʵÏÖ¸ü´ó·¶Î§²Ù×÷µÄÔ­×ÓÐÔ£¬¿ÉÒÔͨ¹ýsynchronizedºÍLockÀ´ÊµÏÖ¡£

4.2 ¿É¼ûÐÔ

¶ÔÓڿɼûÐÔ£¬JavaÌṩÁËvolatile¹Ø¼ü×ÖÀ´±£Ö¤¿É¼ûÐÔ¡£

µ±Ò»¸ö¹²Ïí±äÁ¿±»volatileÐÞÊÎʱ£¬Ëü»á±£Ö¤Ð޸ĵÄÖµ»áÁ¢¼´±»¸üе½Ö÷´æ£¬µ±ÓÐÆäËûÏß³ÌÐèÒª¶Áȡʱ£¬Ëü»áÈ¥ÄÚ´æÖжÁÈ¡ÐÂÖµ¡£

¶øÆÕͨµÄ¹²Ïí±äÁ¿²»Äܱ£Ö¤¿É¼ûÐÔ£¬ÒòΪÆÕͨ¹²Ïí±äÁ¿±»ÐÞ¸ÄÖ®ºó£¬Ê²Ã´Ê±ºò±»Ð´ÈëÖ÷´æÊDz»È·¶¨µÄ£¬µ±ÆäËûÏß³ÌÈ¥¶Áȡʱ£¬´ËʱÄÚ´æÖпÉÄÜ»¹ÊÇÔ­À´µÄ¾ÉÖµ£¬Òò´ËÎÞ·¨±£Ö¤¿É¼ûÐÔ¡£

ÁíÍ⣬ͨ¹ýsynchronizedºÍLockÒ²Äܹ»±£Ö¤¿É¼ûÐÔ£¬synchronizedºÍLockÄܱ£Ö¤Í¬Ò»Ê±¿ÌÖ»ÓÐÒ»¸öÏ̻߳ñÈ¡ËøÈ»ºóÖ´ÐÐͬ²½´úÂ룬²¢ÇÒÔÚÊÍ·ÅËøÖ®Ç°»á½«¶Ô±äÁ¿µÄÐÞ¸Äˢе½Ö÷´æµ±ÖС£Òò´Ë¿ÉÒÔ±£Ö¤¿É¼ûÐÔ¡£

4.3 ÓÐÐòÐÔ

ÔÚJavaÄÚ´æÄ£ÐÍÖУ¬ÔÊÐí±àÒëÆ÷ºÍ´¦ÀíÆ÷¶ÔÖ¸Áî½øÐÐÖØÅÅÐò£¬µ«ÊÇÖØÅÅÐò¹ý³Ì²»»áÓ°Ïìµ½µ¥Ï̳߳ÌÐòµÄÖ´ÐУ¬È´»áÓ°Ïìµ½¶àÏ̲߳¢·¢Ö´ÐеÄÕýÈ·ÐÔ¡£

ÔÚJavaÀïÃæ£¬¿ÉÒÔͨ¹ývolatile¹Ø¼ü×ÖÀ´±£Ö¤Ò»¶¨µÄ¡°ÓÐÐòÐÔ¡±£¨ËüÄܽûÖ¹½øÐÐÖ¸ÁîÖØÅÅÐò£©¡£ÁíÍâ¿ÉÒÔͨ¹ýsynchronizedºÍLockÀ´±£Ö¤ÓÐÐòÐÔ£¬ºÜÏÔÈ»£¬synchronizedºÍLock±£Ö¤Ã¿¸öʱ¿ÌÊÇÓÐÒ»¸öÏß³ÌÖ´ÐÐͬ²½´úÂ룬Ï൱ÓÚÊÇÈÃÏß³Ì˳ÐòÖ´ÐÐͬ²½´úÂ룬×ÔÈ»¾Í±£Ö¤ÁËÓÐÐòÐÔ¡£

ÁíÍ⣬JavaÄÚ´æÄ£Ð;߱¸Ò»Ð©ÏÈÌìµÄ¡°ÓÐÐòÐÔ¡±£¬¼´²»ÐèҪͨ¹ýÈκÎÊֶξÍÄܹ»µÃµ½±£Ö¤µÄÓÐÐòÐÔ£¬Õâ¸öͨ³£Ò²³ÆÎª happens-before Ô­Ôò¡£Èç¹ûÁ½¸ö²Ù×÷µÄÖ´ÐдÎÐòÎÞ·¨´Óhappens-beforeÔ­ÔòÍÆµ¼³öÀ´£¬ÄÇôËüÃǾͲ»Äܱ£Ö¤ËüÃǵÄÓÐÐòÐÔ£¬ÐéÄâ»ú¿ÉÒÔËæÒâµØ¶ÔËüÃǽøÐÐÖØÅÅÐò¡£

ÏÂÃæ¾ÍÀ´¾ßÌå½éÉÜÏÂhappens-beforeÔ­Ôò£¨ÏÈÐз¢ÉúÔ­Ôò£©£º

1.³ÌÐò´ÎÐò¹æÔò£ºÒ»¸öÏß³ÌÄÚ£¬°´ÕÕ´úÂë˳Ðò£¬ÊéдÔÚÇ°ÃæµÄ²Ù×÷ÏÈÐз¢ÉúÓÚÊéдÔÚºóÃæµÄ²Ù×÷

2.Ëø¶¨¹æÔò£ºÒ»¸öunLock²Ù×÷ÏÈÐз¢ÉúÓÚºóÃæ¶Ôͬһ¸öËø¶îlock²Ù×÷

3.volatile±äÁ¿¹æÔò£º¶ÔÒ»¸ö±äÁ¿µÄд²Ù×÷ÏÈÐз¢ÉúÓÚºóÃæ¶ÔÕâ¸ö±äÁ¿µÄ¶Á²Ù×÷

4.´«µÝ¹æÔò£ºÈç¹û²Ù×÷AÏÈÐз¢ÉúÓÚ²Ù×÷B£¬¶ø²Ù×÷BÓÖÏÈÐз¢ÉúÓÚ²Ù×÷C£¬Ôò¿ÉÒԵóö²Ù×÷AÏÈÐз¢ÉúÓÚ²Ù×÷C

5.Ïß³ÌÆô¶¯¹æÔò£ºThread¶ÔÏóµÄstart()·½·¨ÏÈÐз¢ÉúÓÚ´ËÏ̵߳Äÿ¸öÒ»¸ö¶¯×÷

6.Ïß³ÌÖжϹæÔò£º¶ÔÏß³Ìinterrupt()·½·¨µÄµ÷ÓÃÏÈÐз¢ÉúÓÚ±»ÖжÏÏ̵߳ĴúÂë¼ì²âµ½ÖжÏʼþµÄ·¢Éú

7.Ïß³ÌÖÕ½á¹æÔò£ºÏß³ÌÖÐËùÓеIJÙ×÷¶¼ÏÈÐз¢ÉúÓÚÏ̵߳ÄÖÕÖ¹¼ì²â£¬ÎÒÃÇ¿ÉÒÔͨ¹ýThread.join()·½·¨½áÊø¡¢Thread.isAlive()µÄ·µ»ØÖµÊֶμì²âµ½Ïß³ÌÒѾ­ÖÕÖ¹Ö´ÐÐ

8.¶ÔÏóÖÕ½á¹æÔò£ºÒ»¸ö¶ÔÏóµÄ³õʼ»¯Íê³ÉÏÈÐз¢ÉúÓÚËûµÄfinalize()·½·¨µÄ¿ªÊ¼

Õâ8Ìõ¹æÔòÖУ¬Ç°4Ìõ¹æÔòÊDZȽÏÖØÒªµÄ£¬ºó4Ìõ¹æÔò¶¼ÊÇÏÔ¶øÒ×¼ûµÄ¡£

ÏÂÃæÎÒÃÇÀ´½âÊÍÒ»ÏÂǰ4Ìõ¹æÔò£º

1.¶ÔÓÚ³ÌÐò´ÎÐò¹æÔòÀ´Ëµ£¬ÎÒµÄÀí½â¾ÍÊÇÒ»¶Î³ÌÐò´úÂëµÄÖ´ÐÐÔÚµ¥¸öÏß³ÌÖп´ÆðÀ´ÊÇÓÐÐòµÄ¡£×¢Ò⣬ËäÈ»ÕâÌõ¹æÔòÖÐÌáµ½¡°ÊéдÔÚÇ°ÃæµÄ²Ù×÷ÏÈÐз¢ÉúÓÚÊéдÔÚºóÃæµÄ²Ù×÷¡±£¬Õâ¸öÓ¦¸ÃÊdzÌÐò¿´ÆðÀ´Ö´ÐеÄ˳ÐòÊǰ´ÕÕ´úÂë˳ÐòÖ´Ðеģ¬ÒòΪÐéÄâ»ú¿ÉÄÜ»á¶Ô³ÌÐò´úÂë½øÐÐÖ¸ÁîÖØÅÅÐò¡£ËäÈ»½øÐÐÖØÅÅÐò£¬µ«ÊÇ×îÖÕÖ´ÐеĽá¹ûÊÇÓë³ÌÐò˳ÐòÖ´ÐеĽá¹ûÒ»Öµģ¬ËüÖ»»á¶Ô²»´æÔÚÊý¾ÝÒÀÀµÐÔµÄÖ¸Áî½øÐÐÖØÅÅÐò¡£Òò´Ë£¬ÔÚµ¥¸öÏß³ÌÖУ¬³ÌÐòÖ´Ðп´ÆðÀ´ÊÇÓÐÐòÖ´Ðеģ¬ÕâÒ»µãҪעÒâÀí½â¡£ÊÂʵÉÏ£¬Õâ¸ö¹æÔòÊÇÓÃÀ´±£Ö¤³ÌÐòÔÚµ¥Ïß³ÌÖÐÖ´Ðнá¹ûµÄÕýÈ·ÐÔ£¬µ«ÎÞ·¨±£Ö¤³ÌÐòÔÚ¶àÏß³ÌÖÐÖ´ÐеÄÕýÈ·ÐÔ¡£

2.µÚ¶þÌõ¹æÔòÒ²±È½ÏÈÝÒ×Àí½â£¬Ò²¾ÍÊÇ˵ÎÞÂÛÔÚµ¥Ïß³ÌÖл¹ÊǶàÏß³ÌÖУ¬Í¬Ò»¸öËøÈç¹û³öÓÚ±»Ëø¶¨µÄ״̬£¬ÄÇô±ØÐëÏȶÔËø½øÐÐÁËÊͷŲÙ×÷£¬ºóÃæ²ÅÄܼÌÐø½øÐÐlock²Ù×÷¡£

3.µÚÈýÌõ¹æÔòÊÇÒ»Ìõ±È½ÏÖØÒªµÄ¹æÔò£¬Ò²ÊǺóÎĽ«ÒªÖص㽲ÊöµÄÄÚÈÝ¡£Ö±¹ÛµØ½âÊ;ÍÊÇ£¬Èç¹ûÒ»¸öÏß³ÌÏÈȥдһ¸ö±äÁ¿£¬È»ºóÒ»¸öÏß³ÌÈ¥½øÐжÁÈ¡£¬ÄÇôдÈë²Ù×÷¿Ï¶¨»áÏÈÐз¢ÉúÓÚ¶Á²Ù×÷¡£

4.µÚËÄÌõ¹æÔòʵ¼ÊÉϾÍÊÇÌåÏÖhappens-beforeÔ­Ôò¾ß±¸´«µÝÐÔ¡£

5¡¢ÉîÈëÆÊÎövolatile¹Ø¼ü×Ö

5.1 Volatile¹Ø¼ü×ÖµÄÁ½²ãÓïÒå

Ò»µ©Ò»¸ö¹²Ïí±äÁ¿£¨ÀàµÄ³ÉÔ±±äÁ¿¡¢ÀàµÄ¾²Ì¬³ÉÔ±±äÁ¿£©±»volatileÐÞÊÎÖ®ºó£¬ÄÇô¾Í¾ß±¸ÁËÁ½²ãÓïÒ壺

1.±£Ö¤Á˲»Í¬Ï̶߳ÔÕâ¸ö±äÁ¿½øÐвÙ×÷ʱµÄ¿É¼ûÐÔ£¬¼´Ò»¸öÏß³ÌÐÞ¸ÄÁËij¸ö±äÁ¿µÄÖµ£¬ÕâÐÂÖµ¶ÔÆäËûÏß³ÌÀ´ËµÊÇÁ¢¼´¿É¼ûµÄ¡£

2.½ûÖ¹½øÐÐÖ¸ÁîÖØÅÅÐò¡£

¹ØÓڿɼûÐÔ£¬ÏÈ¿´Ò»¶Î´úÂ룬¼ÙÈçÏß³Ì1ÏÈÖ´ÐУ¬Ïß³Ì2ºóÖ´ÐУº

//Ïß³Ì1
boolean stop = false;
while(!stop){
doSomething();
}

//Ïß³Ì2
stop = true;

Õâ¶Î´úÂëÊǺܵäÐ͵ÄÒ»¶Î´úÂ룬ºÜ¶àÈËÔÚÖжÏÏß³Ìʱ¿ÉÄܶ¼»á²ÉÓÃÕâÖÖ±ê¼Ç°ì·¨¡£µ«ÊÇÊÂʵÉÏ£¬Õâ¶Î´úÂë»áÍêÈ«ÔËÐÐÕýȷô£¿¼´Ò»¶¨»á½«Ïß³ÌÖжÏô£¿²»Ò»¶¨£¬Ò²ÐíÔÚ´ó¶àÊýʱºò£¬Õâ¸ö´úÂëÄܹ»°ÑÏß³ÌÖжϣ¬µ«ÊÇÒ²ÓпÉÄܻᵼÖÂÎÞ·¨ÖжÏỊ̈߳¨ËäÈ»Õâ¸ö¿ÉÄÜÐÔºÜС£¬µ«ÊÇÖ»ÒªÒ»µ©·¢ÉúÕâÖÖÇé¿ö¾Í»áÔì³ÉËÀÑ­»·ÁË£©¡£

ÏÂÃæ½âÊÍÒ»ÏÂÕâ¶Î´úÂëΪºÎÓпÉÄܵ¼ÖÂÎÞ·¨ÖжÏÏ̡߳£ÔÚÇ°ÃæÒѾ­½âÊ͹ý£¬Ã¿¸öÏß³ÌÔÚÔËÐйý³ÌÖж¼ÓÐ×Ô¼ºµÄ¹¤×÷Äڴ棬ÄÇôÏß³Ì1ÔÚÔËÐеÄʱºò£¬»á½«stop±äÁ¿µÄÖµ¿½±´Ò»·Ý·ÅÔÚ×Ô¼ºµÄ¹¤×÷ÄÚ´æµ±ÖС£

ÄÇôµ±Ïß³Ì2¸ü¸ÄÁËstop±äÁ¿µÄÖµÖ®ºó£¬µ«ÊÇ»¹Ã»À´µÃ¼°Ð´ÈëÖ÷´æµ±ÖУ¬Ïß³Ì2תȥ×öÆäËûÊÂÇéÁË£¬ÄÇôÏß³Ì1ÓÉÓÚ²»ÖªµÀÏß³Ì2¶Ôstop±äÁ¿µÄ¸ü¸Ä£¬Òò´Ë»¹»áһֱѭ»·ÏÂÈ¥¡£

µ«ÊÇÓÃvolatileÐÞÊÎÖ®ºó¾Í±äµÃ²»Ò»ÑùÁË£º

µÚÒ»£ºÊ¹ÓÃvolatile¹Ø¼ü×Ö»áÇ¿ÖÆ½«Ð޸ĵÄÖµÁ¢¼´Ð´ÈëÖ÷´æ£»

µÚ¶þ£ºÊ¹ÓÃvolatile¹Ø¼ü×ֵϰ£¬µ±Ïß³Ì2½øÐÐÐÞ¸Äʱ£¬»áµ¼ÖÂÏß³Ì1µÄ¹¤×÷ÄÚ´æÖлº´æ±äÁ¿stopµÄ»º´æÐÐÎÞЧ£¨·´Ó³µ½Ó²¼þ²ãµÄ»°£¬¾ÍÊÇCPUµÄL1»òÕßL2»º´æÖжÔÓ¦µÄ»º´æÐÐÎÞЧ£©£»

µÚÈý£ºÓÉÓÚÏß³Ì1µÄ¹¤×÷ÄÚ´æÖлº´æ±äÁ¿stopµÄ»º´æÐÐÎÞЧ£¬ËùÒÔÏß³Ì1ÔٴζÁÈ¡±äÁ¿stopµÄֵʱ»áÈ¥Ö÷´æ¶ÁÈ¡¡£

ÄÇôÔÚÏß³Ì2ÐÞ¸Ästopֵʱ£¨µ±È»ÕâÀï°üÀ¨2¸ö²Ù×÷£¬ÐÞ¸ÄÏß³Ì2¹¤×÷ÄÚ´æÖеÄÖµ£¬È»ºó½«Ð޸ĺóµÄֵдÈëÄڴ棩£¬»áʹµÃÏß³Ì1µÄ¹¤×÷ÄÚ´æÖлº´æ±äÁ¿stopµÄ»º´æÐÐÎÞЧ£¬È»ºóÏß³Ì1¶Áȡʱ£¬·¢ÏÖ×Ô¼ºµÄ»º´æÐÐÎÞЧ£¬Ëü»áµÈ´ý»º´æÐжÔÓ¦µÄÖ÷´æµØÖ·±»¸üÐÂÖ®ºó£¬È»ºóÈ¥¶ÔÓ¦µÄÖ÷´æ¶ÁÈ¡×îеÄÖµ¡£

ÄÇôÏß³Ì1¶ÁÈ¡µ½µÄ¾ÍÊÇ×îеÄÕýÈ·µÄÖµ¡£

5.2 volatile±£Ö¤Ô­×ÓÐÔÂð£¿

volatile²»±£Ö¤Ô­×ÓÐÔ£¬ÏÂÃæ¿´Ò»¸öʵÀý¡£

public class Test {
public volatile int inc = 0;

public void increase() {
inc++;
}

public static void main(String[] args) {
final Test test = new Test();
for(int i=0;i<10;i++){
new Thread(){
public void run() {
for(int j=0;j<1000;j++)
test.increase();
};
}.start();
}

while(Thread.activeCount()>1) //±£Ö¤Ç°ÃæµÄÏ̶߳¼Ö´ÐÐÍê
Thread.yield();
System.out.println(test.inc);
}
}

´ó¼ÒÏëÒ»ÏÂÕâ¶Î³ÌÐòµÄÊä³ö½á¹ûÊǶàÉÙ£¿Ò²ÐíÓÐЩÅóÓÑÈÏΪÊÇ10000¡£µ«ÊÇÊÂʵÉÏÔËÐÐËü»á·¢ÏÖÿ´ÎÔËÐнá¹û¶¼²»Ò»Ö£¬¶¼ÊÇÒ»¸öСÓÚ10000µÄÊý×Ö¡£

ÕâÀïÃæ¾ÍÓÐÒ»¸öÎóÇøÁË£¬volatile¹Ø¼ü×ÖÄܱ£Ö¤¿É¼ûÐÔûÓÐ´í£¬µ«ÊÇÉÏÃæµÄ³ÌÐò´íÔÚûÄܱ£Ö¤Ô­×ÓÐÔ¡£¿É¼ûÐÔÖ»Äܱ£Ö¤Ã¿´Î¶ÁÈ¡µÄÊÇ×îеÄÖµ£¬µ«ÊÇvolatileû°ì·¨±£Ö¤¶Ô±äÁ¿µÄ²Ù×÷µÄÔ­×ÓÐÔ¡£

ÔÚÇ°ÃæÒѾ­Ìáµ½¹ý£¬×ÔÔö²Ù×÷ÊDz»¾ß±¸Ô­×ÓÐԵģ¬Ëü°üÀ¨¶ÁÈ¡±äÁ¿µÄԭʼֵ¡¢½øÐмÓ1²Ù×÷¡¢Ð´È빤×÷ÄÚ´æ¡£ÄÇô¾ÍÊÇ˵×ÔÔö²Ù×÷µÄÈý¸ö×Ó²Ù×÷¿ÉÄÜ»á·Ö¸î¿ªÖ´ÐУ¬¾ÍÓпÉÄܵ¼ÖÂÏÂÃæÕâÖÖÇé¿ö³öÏÖ£º

¼ÙÈçij¸öʱ¿Ì±äÁ¿incµÄֵΪ10¡£

Ïß³Ì1¶Ô±äÁ¿½øÐÐ×ÔÔö²Ù×÷£¬Ïß³Ì1ÏȶÁÈ¡Á˱äÁ¿incµÄԭʼֵ£¬È»ºóÏß³Ì1±»×èÈûÁË£»

È»ºóÏß³Ì2¶Ô±äÁ¿½øÐÐ×ÔÔö²Ù×÷£¬Ïß³Ì2Ҳȥ¶ÁÈ¡±äÁ¿incµÄԭʼֵ£¬ÓÉÓÚÏß³Ì1Ö»ÊǶԱäÁ¿inc½øÐжÁÈ¡²Ù×÷£¬¶øÃ»ÓжԱäÁ¿½øÐÐÐ޸IJÙ×÷£¬ËùÒÔ²»»áµ¼ÖÂÏß³Ì2µÄ¹¤×÷ÄÚ´æÖлº´æ±äÁ¿incµÄ»º´æÐÐÎÞЧ£¬ËùÒÔÏß³Ì2»áÖ±½ÓÈ¥Ö÷´æ¶ÁÈ¡incµÄÖµ£¬·¢ÏÖincµÄֵʱ10£¬È»ºó½øÐмÓ1²Ù×÷£¬²¢°Ñ11дÈ빤×÷Äڴ棬×îºóдÈëÖ÷´æ¡£

È»ºóÏß³Ì1½Ó׎øÐмÓ1²Ù×÷£¬ÓÉÓÚÒѾ­¶ÁÈ¡ÁËincµÄÖµ£¬×¢Òâ´ËʱÔÚÏß³Ì1µÄ¹¤×÷ÄÚ´æÖÐincµÄÖµÈÔȻΪ10£¬ËùÒÔÏß³Ì1¶Ôinc½øÐмÓ1²Ù×÷ºóincµÄֵΪ11£¬È»ºó½«11дÈ빤×÷Äڴ棬×îºóдÈëÖ÷´æ¡£

ÄÇôÁ½¸öÏ̷ֱ߳ð½øÐÐÁËÒ»´Î×ÔÔö²Ù×÷ºó£¬incÖ»Ôö¼ÓÁË1¡£

½âÊ͵½ÕâÀ¿ÉÄÜÓÐÅóÓÑ»áÓÐÒÉÎÊ£¬²»¶Ô°¡£¬Ç°Ãæ²»ÊDZ£Ö¤Ò»¸ö±äÁ¿ÔÚÐÞ¸Ävolatile±äÁ¿Ê±£¬»áÈûº´æÐÐÎÞЧÂð£¿È»ºóÆäËûÏß³ÌÈ¥¶Á¾Í»á¶Áµ½ÐµÄÖµ£¬¶Ô£¬Õâ¸öû´í¡£Õâ¸ö¾ÍÊÇÉÏÃæµÄhappens-before¹æÔòÖеÄvolatile±äÁ¿¹æÔò£¬µ«ÊÇҪעÒ⣬Ïß³Ì1¶Ô±äÁ¿½øÐжÁÈ¡²Ù×÷Ö®ºó£¬±»×èÈûÁ˵ϰ£¬²¢Ã»ÓжÔincÖµ½øÐÐÐ޸ġ£È»ºóËäÈ»volatileÄܱ£Ö¤Ïß³Ì2¶Ô±äÁ¿incµÄÖµ¶ÁÈ¡ÊÇ´ÓÄÚ´æÖжÁÈ¡µÄ£¬µ«ÊÇÏß³Ì1ûÓнøÐÐÐ޸ģ¬ËùÒÔÏß³Ì2¸ù±¾¾Í²»»á¿´µ½Ð޸ĵÄÖµ¡£

¸ùÔ´¾ÍÔÚÕâÀ×ÔÔö²Ù×÷²»ÊÇÔ­×ÓÐÔ²Ù×÷£¬¶øÇÒvolatileÒ²ÎÞ·¨±£Ö¤¶Ô±äÁ¿µÄÈκβÙ×÷¶¼ÊÇÔ­×ÓÐԵġ£

°ÑÉÏÃæµÄ´úÂë¸Ä³ÉÒÔÏÂÈκÎÒ»ÖÖ¶¼¿ÉÒԴﵽЧ¹û£º

²ÉÓÃsynchronized£º

public class Test {
public int inc = 0;

public synchronized void increase() {
inc++;
}

public static void main(String[] args) {
final Test test = new Test();
for(int i=0;i<10;i++){
new Thread(){
public void run() {
for(int j=0;j<1000;j++)
test.increase();
};
}.start();
}

while(Thread.activeCount()>1) //±£Ö¤Ç°ÃæµÄÏ̶߳¼Ö´ÐÐÍê
Thread.yield();
System.out.println(test.inc);
}
}

²ÉÓÃLock£º

public class Test {
public int inc = 0;
Lock lock = new ReentrantLock();

public void increase() {
lock.lock();
try {
inc++;
} finally{
lock.unlock();
}
}

public static void main(String[] args) {
final Test test = new Test();
for(int i=0;i<10;i++){
new Thread(){
public void run() {
for(int j=0;j<1000;j++)
test.increase();
};
}.start();
}

while(Thread.activeCount()>1) //±£Ö¤Ç°ÃæµÄÏ̶߳¼Ö´ÐÐÍê
Thread.yield();
System.out.println(test.inc);
}
}

²ÉÓÃAtomicInteger£º

public class Test {
public AtomicInteger inc = new AtomicInteger();

public void increase() {
inc.getAndIncrement();
}

public static void main(String[] args) {
final Test test = new Test();
for(int i=0;i<10;i++){
new Thread(){
public void run() {
for(int j=0;j<1000;j++)
test.increase();
};
}.start();
}

while(Thread.activeCount()>1) //±£Ö¤Ç°ÃæµÄÏ̶߳¼Ö´ÐÐÍê
Thread.yield();
System.out.println(test.inc);
}
}

ÔÚjava 1.5µÄjava.util.concurrent.atomic°üÏÂÌṩÁËһЩԭ×Ó²Ù×÷À࣬¼´¶Ô»ù±¾Êý¾ÝÀàÐ굀 ×ÔÔö£¨¼Ó1²Ù×÷£©£¬×Ô¼õ£¨¼õ1²Ù×÷£©¡¢ÒÔ¼°¼Ó·¨²Ù×÷£¨¼ÓÒ»¸öÊý£©£¬¼õ·¨²Ù×÷£¨¼õÒ»¸öÊý£©½øÐÐÁË·â×°£¬±£Ö¤ÕâЩ²Ù×÷ÊÇÔ­×ÓÐÔ²Ù×÷¡£atomicÊÇÀûÓÃCASÀ´ÊµÏÖÔ­×ÓÐÔ²Ù×÷µÄ£¨Compare And Swap£©£¬CASʵ¼ÊÉÏÊÇÀûÓô¦ÀíÆ÷ÌṩµÄCMPXCHGÖ¸ÁîʵÏֵ쬶ø´¦ÀíÆ÷Ö´ÐÐCMPXCHGÖ¸ÁîÊÇÒ»¸öÔ­×ÓÐÔ²Ù×÷¡£

5.3 volatileÄܱ£Ö¤ÓÐÐòÐÔÂð£¿

volatileÄÜÔÚÒ»¶¨³Ì¶ÈÉϱ£Ö¤ÓÐÐòÐÔ¡£

volatile¹Ø¼ü×Ö½ûÖ¹Ö¸ÁîÖØÅÅÐòÓÐÁ½²ãÒâ˼£º

1£©µ±³ÌÐòÖ´Ðе½volatile±äÁ¿µÄ¶Á²Ù×÷»òÕßд²Ù×÷ʱ£¬ÔÚÆäÇ°ÃæµÄ²Ù×÷µÄ¸ü¸Ä¿Ï¶¨È«²¿ÒѾ­½øÐУ¬ÇÒ½á¹ûÒѾ­¶ÔºóÃæµÄ²Ù×÷¿É¼û£»ÔÚÆäºóÃæµÄ²Ù×÷¿Ï¶¨»¹Ã»ÓнøÐУ»

2£©ÔÚ½øÐÐÖ¸ÁîÓÅ»¯Ê±£¬²»Äܽ«ÔÚ¶Ôvolatile±äÁ¿·ÃÎʵÄÓï¾ä·ÅÔÚÆäºóÃæÖ´ÐУ¬Ò²²»ÄܰÑvolatile±äÁ¿ºóÃæµÄÓï¾ä·Åµ½ÆäÇ°ÃæÖ´ÐС£

¾Ù¸öÀý×Ó£º

//x¡¢yΪ·Çvolatile±äÁ¿
//flagΪvolatile±äÁ¿

x = 2; //Óï¾ä1
y = 0; //Óï¾ä2
flag = true; //Óï¾ä3
x = 4; //Óï¾ä4
y = -1; //Óï¾ä5

ÓÉÓÚflag±äÁ¿Îªvolatile±äÁ¿£¬ÄÇôÔÚ½øÐÐÖ¸ÁîÖØÅÅÐòµÄ¹ý³ÌµÄʱºò£¬²»»á½«Óï¾ä3·Åµ½Óï¾ä1¡¢Óï¾ä2Ç°Ãæ£¬Ò²²»»á½²Óï¾ä3·Åµ½Óï¾ä4¡¢Óï¾ä5ºóÃæ¡£µ«ÊÇҪעÒâÓï¾ä1ºÍÓï¾ä2µÄ˳Ðò¡¢Óï¾ä4ºÍÓï¾ä5µÄ˳ÐòÊDz»×÷Èκα£Ö¤µÄ¡£

²¢ÇÒvolatile¹Ø¼ü×ÖÄܱ£Ö¤£¬Ö´Ðе½Óï¾ä3ʱ£¬Óï¾ä1ºÍÓï¾ä2±Ø¶¨ÊÇÖ´ÐÐÍê±ÏÁ˵ģ¬ÇÒÓï¾ä1ºÍÓï¾ä2µÄÖ´Ðнá¹û¶ÔÓï¾ä3¡¢Óï¾ä4¡¢Óï¾ä5ÊǿɼûµÄ¡£

5.4 volatileµÄÔ­ÀíºÍʵÏÖ»úÖÆ

ÕâÀï̽ÌÖÒ»ÏÂvolatileµ½µ×ÈçºÎ±£Ö¤¿É¼ûÐԺͽûÖ¹Ö¸ÁîÖØÅÅÐòµÄ¡£

ÏÂÃæÕâ¶Î»°Õª×Ô¡¶ÉîÈëÀí½âJavaÐéÄâ»ú¡·£º

¡°¹Û²ì¼ÓÈëvolatile¹Ø¼ü×ÖºÍûÓмÓÈëvolatile¹Ø¼ü×ÖʱËùÉú³ÉµÄ»ã±à´úÂë·¢ÏÖ£¬¼ÓÈëvolatile¹Ø¼ü×Öʱ£¬»á¶à³öÒ»¸ölockǰ׺ָÁ

lockǰ׺ָÁîʵ¼ÊÉÏÏ൱ÓÚÒ»¸öÄÚ´æÆÁÕÏ£¨Ò²³ÉÄÚ´æÕ¤À¸£©£¬ÄÚ´æÆÁÕÏ»áÌṩ3¸ö¹¦ÄÜ£º

1.ËüÈ·±£Ö¸ÁîÖØÅÅÐòʱ²»»á°ÑÆäºóÃæµÄÖ¸ÁîÅŵ½ÄÚ´æÆÁÕÏ֮ǰµÄλÖã¬Ò²²»»á°ÑÇ°ÃæµÄÖ¸ÁîÅŵ½ÄÚ´æÆÁÕϵĺóÃæ£»¼´ÔÚÖ´Ðе½ÄÚ´æÆÁÕÏÕâ¾äÖ¸Áîʱ£¬ÔÚËüÇ°ÃæµÄ²Ù×÷ÒѾ­È«²¿Íê³É£»

2.Ëü»áÇ¿ÖÆ½«¶Ô»º´æµÄÐ޸IJÙ×÷Á¢¼´Ð´ÈëÖ÷´æ£»

3.Èç¹ûÊÇд²Ù×÷£¬Ëü»áµ¼ÖÂÆäËûCPUÖжÔÓ¦µÄ»º´æÐÐÎÞЧ¡£

6¡¢Ê¹ÓÃvolatile¹Ø¼ü×ֵij¡¾°

synchronized¹Ø¼ü×ÖÊÇ·ÀÖ¹¶à¸öÏß³ÌͬʱִÐÐÒ»¶Î´úÂ룬ÄÇô¾Í»áºÜÓ°Ïì³ÌÐòÖ´ÐÐЧÂÊ£¬¶øvolatile¹Ø¼ü×ÖÔÚijЩÇé¿öÏÂÐÔÄÜÒªÓÅÓÚsynchronized£¬µ«ÊÇҪעÒâvolatile¹Ø¼ü×ÖÊÇÎÞ·¨Ìæ´úsynchronized¹Ø¼ü×ֵģ¬ÒòΪvolatile¹Ø¼ü×ÖÎÞ·¨±£Ö¤²Ù×÷µÄÔ­×ÓÐÔ¡£Í¨³£À´Ëµ£¬Ê¹ÓÃvolatile±ØÐë¾ß±¸ÒÔÏÂ2¸öÌõ¼þ£º

1.¶Ô±äÁ¿µÄд²Ù×÷²»ÒÀÀµÓÚµ±Ç°Öµ£¨±ÈÈç++²Ù×÷£¬ÉÏÃæÓÐÀý×Ó£©

2.¸Ã±äÁ¿Ã»Óаüº¬ÔÚ¾ßÓÐÆäËû±äÁ¿µÄ²»±äʽÖÐ

ʵ¼ÊÉÏ£¬ÕâЩÌõ¼þ±íÃ÷£¬¿ÉÒÔ±»Ð´Èë volatile ±äÁ¿µÄÕâЩÓÐЧֵ¶ÀÁ¢ÓÚÈκγÌÐòµÄ״̬£¬°üÀ¨±äÁ¿µÄµ±Ç°×´Ì¬¡£

ÊÂʵÉÏ£¬ÎÒµÄÀí½â¾ÍÊÇÉÏÃæµÄ2¸öÌõ¼þÐèÒª±£Ö¤²Ù×÷ÊÇÔ­×ÓÐÔ²Ù×÷£¬²ÅÄܱ£Ö¤Ê¹ÓÃvolatile¹Ø¼ü×ֵijÌÐòÔÚ²¢·¢Ê±Äܹ»ÕýÈ·Ö´ÐС£

ÏÂÃæÁоټ¸¸öJavaÖÐʹÓÃvolatileµÄ¼¸¸ö³¡¾°¡£

״̬±ê¼ÇÁ¿

volatile boolean flag = false;

while(!flag){
doSomething();
}

public void setFlag() {
flag = true;
}

volatile boolean inited = false;
//Ïß³Ì1:
context = loadContext();
inited = true;

//Ïß³Ì2:
while(!inited ){
sleep()
}
doSomethingwithconfig(context);

double check

class Singleton{
private volatile static Singleton instance = null;

private Singleton() {

}

public static Singleton getInstance() {
if(instance==null) {
synchronized (Singleton.class) {
if(instance==null)
instance = new Singleton();
}
}
return instance;
}
}

ÖÁÓÚΪºÎÐèÒªÕâôдÇë²Î¿¼£º

¡¶Java ÖеÄË«ÖØ¼ì²é£¨Double-Check£©¡·http://blog.csdn.net/dl88250/article/details/5439024ºÍhttp://www.iteye.com/topic/652440

 

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

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