Java±à³Ì˼ÏëµÚ4°æ[ÖÐÎÄ°æ](PDF¸ñʽ)-µÚ130²¿·Ö
°´¼üÅÌÉÏ·½Ïò¼ü ¡û »ò ¡ú ¿É¿ìËÙÉÏÏ·ҳ£¬°´¼üÅÌÉ쵀 Enter ¼ü¿É»Øµ½±¾ÊéĿ¼ҳ£¬°´¼üÅÌÉÏ·½Ïò¼ü ¡ü ¿É»Øµ½±¾Ò³¶¥²¿£¡
¡ª¡ª¡ª¡ªÎ´ÔĶÁÍꣿ¼ÓÈëÊéÇ©ÒѱãÏ´μÌÐøÔĶÁ£¡
¡¡¡¡¡¡¡¡aFrame¡£addWindowListener£¨¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡new¡¡WindowAdapter£¨£©¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡public¡¡void¡¡windowClosing£¨WindowEvent¡¡e£©£û¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡System¡£exit£¨0£©£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡£ý¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡£ý£©£»¡¡¡¡
¡¡¡¡¡¡¡¡aFrame¡£add£¨applet£»¡¡BorderLayout¡£CENTER£©£»¡¡¡¡
¡¡¡¡¡¡¡¡aFrame¡£setSize£¨350£»¡¡applet¡£numCounters¡¡*100£©£»¡¡¡¡
¡¡¡¡¡¡¡¡applet¡£init£¨£©£»¡¡¡¡
¡¡¡¡¡¡¡¡applet¡£start£¨£©£»¡¡¡¡
¡¡¡¡¡¡¡¡aFrame¡£setVisible£¨true£©£»¡¡¡¡
¡¡¡¡£ý¡¡¡¡
£ý¡¡///£º~¡¡¡¡
¡¡¡¡
ºÍÍù³£Ò»Ñù£¬Ã¿¸ö¼ÆÊýÆ÷¶¼°üº¬ÁË×Ô¼ºµÄÏÔʾ×é¼þ£ºÁ½¸öÎı¾×Ö¶ÎÒÔ¼°Ò»¸ö±êÇ©¡£¸ù¾ÝËüÃǵijõʼֵ£¬¿ÉÖª¡¡
µÀ¼ÆÊýÊÇÏàͬµÄ¡£ÕâЩ×é¼þÔÚ¡¡TwoCounter¡¡¹¹½¨Æ÷¼ÓÈë¡¡Container¡£ÓÉÓÚÕâ¸öÏß³ÌÊÇͨ¹ýÓû§µÄÒ»¸ö¡°°´Ï°´¡¡
Å¥¡±²Ù×÷Æô¶¯µÄ£¬ËùÒÔ¡¡start£¨£©¿ÉÄܱ»¶à´Îµ÷Óᣵ«¶ÔÒ»¸öÏß³ÌÀ´Ëµ£¬¶Ô¡¡Thread¡£start£¨£©µÄ¶à´Îµ÷ÓÃÊÇ·Ç·¨¡¡
µÄ£¨»á²úÉúÎ¥Àý£©¡£ÔÚ¡¡started±ê¼ÇºÍ¹ýÔصġ¡start£¨£©·½·¨ÖУ¬´ó¼Ò¿É¿´µ½Õë¶ÔÕâÒ»Çé¿ö²ÉÈ¡µÄ·À·¶´ëÊ©¡£¡¡¡¡
ÔÚrun£¨£©ÖУ¬count1¡¡ºÍ¡¡count2¡¡µÄÔöÖµÓëÏÔʾ·½Ê½±íÃæÉÏËƺõÄܱ£³ÖËüÃÇÍêÈ«Ò»Ö¡£Ëæºó»áµ÷ÓÃsleep£¨£©£»Èô¡¡
ûÓÐÕâ¸öµ÷Ó㬳ÌÐò±ã»á³ö´í£¬ÒòΪÄÇ»áÔì³É¡¡CPU¡¡ÄÑÓÚ½»»»ÈÎÎñ¡£¡¡¡¡
synchTest£¨£©·½·¨²ÉÈ¡µÄËƺõÊÇûÓÐÒâÒåµÄÐж¯£¬Ëü¼ì²é¡¡count1¡¡ÊÇ·ñµÈÓÚcount2£»Èç¹û²»µÈ£¬¾Í°Ñ±êÇ©ÉèΪ¡¡
¡¡¡°Unsynched¡±£¨²»Í¬²½£©¡£µ«ÊÇÊ×ÏÈ£¬Ëüµ÷ÓõÄÊÇÀàSharing1¡¡µÄÒ»¸ö¾²Ì¬³ÉÔ±£¬ÒÔ±ãÔöÖµºÍÏÔʾһ¸ö·ÃÎÊ¡¡
¼ÆÊýÆ÷£¬Ö¸³öÕâÖÖ¼ì²éÒѳɹ¦½øÐÐÁ˶àÉٴΣ¨ÕâÑù×öµÄÀíÓÉ»áÔÚ±¾ÀýµÄÆäËû°æ±¾ÖбäµÃ·Ç³£Ã÷ÏÔ£©¡£¡¡¡¡
Watcher¡¡ÀàÊÇÒ»¸öỊ̈߳¬ËüµÄ×÷ÓÃÊÇΪ´¦Óڻ״̬µÄËùÓС¡TwoCounter¡¡¶ÔÏ󶼵÷Óá¡synchTest£¨£©¡£Æä¼ä£¬Ëü¡¡
»á¶ÔSharing1¡¡¶ÔÏóÖÐÈÝÄɵÄÊý×é½øÐбéÀú¡£¿É½«¡¡Watcher¡¡ÏëÏó³ÉËüÂÓ¹ý¡¡TwoCounter¡¡¶ÔÏóµÄ¼ç°ò²»¶ÏµØ¡°Íµ¡¡
¿´¡±¡£¡¡¡¡
Sharing1¡¡°üº¬ÁË¡¡TwoCounter¡¡¶ÔÏóµÄÒ»¸öÊý×飬Ëüͨ¹ý¡¡init£¨£©½øÐгõʼ»¯£¬²¢ÔÚÎÒÃÇ°´Ï¡°start¡±°´Å¥ºó×÷¡¡
ΪÏß³ÌÆô¶¯¡£ÒÔºóÈô°´Ï¡°Observe¡±£¨¹Û²ì£©°´Å¥£¬¾Í»á´´½¨Ò»¸ö»òÕ߶à¸ö¹Û²ìÆ÷£¬²¢¶ÔºÁ²»Éè·ÀµÄ¡¡
TwoCounter¡¡½øÐе÷²é¡£¡¡¡¡
×¢ÒâΪÁËÈÃËü×÷Ϊһ¸ö³ÌÐòƬÔÚä¯ÀÀÆ÷ÖÐÔËÐУ¬Web¡¡Ò³ÐèÒª°üº¬ÏÂÃæÕ⼸ÐУº¡¡¡¡
¡¡¡¡
¡¡¡¡
¡¡¡¡
¡¡¡¡
¡¡¡¡
¡¡¡¡
¿É×ÔÐиıä¿í¶È¡¢¸ß¶ÈÒÔ¼°²ÎÊý£¬¸ù¾Ý×Ô¼ºµÄÒâÔ¸½øÐÐÊÔÑé¡£Èô¸Ä±äÁËsize¡¡ºÍ¡¡observers£¬³ÌÐòµÄÐÐΪҲ»á¡¡
·¢Éú±ä»¯¡£ÎÒÃÇÒ²×¢Òâµ½£¬Í¨¹ý´ÓÃüÁîÐнÓÊܲÎÊý£¨»òÕßʹÓÃĬÈÏÖµ£©£¬Ëü±»Éè¼Æ³É×÷Ϊһ¸ö¶ÀÁ¢µÄÓ¦Óó̡¡
ÐòÔËÐС£¡¡¡¡
ÏÂÃæ²ÅÊÇ×îÈÃÈË¡°²»¿É˼Ò顱µÄ¡£ÔÚTwoCounter¡£run£¨£©ÖУ¬ÎÞÏÞÑ»·Ö»ÊDz»¶ÏµØÖظ´ÏàÁÚµÄÐУº¡¡¡¡
t1¡£setText£¨Integer¡£toString£¨count1£«£«£©£©£»¡¡¡¡
t2¡£setText£¨Integer¡£toString£¨count2£«£«£©£©£»¡¡¡¡
¡¡£¨ºÍ¡°Ë¯Ãß¡±Ò»Ñù£¬²»¹ýÔÚÕâÀï²¢²»ÖØÒª£©¡£µ«ÔÚ³ÌÐòÔËÐеÄʱºò£¬Äã»á·¢ÏÖcount1ºÍ¡¡count2¡¡±»¡°¹Û²ì¡±¡¡
¡¡£¨ÓÃWatcher¡¡¹Û²ì£©µÄ´ÎÊýÊDz»ÏàµÈµÄ£¡ÕâÊÇÓÉÏ̵߳ı¾ÖÊÔì³ÉµÄ¡ª¡ªËüÃÇ¿ÉÔÚÈκÎʱºò¹ÒÆð£¨ÔÝÍ££©¡£Ëù¡¡
ÒÔÔÚÉÏÊöÁ½ÐеÄÖ´ÐÐʱ¿ÌÖ®¼ä£¬ÓÐʱ»á³öÏÖÖ´ÐÐÔÝÍ£ÏÖÏó¡£Í¬Ê±£¬Watcher¡¡Ïß³ÌÒ²ÕýºÃ¸úËæ׎øÀ´£¬²¢ÕýºÃ¡¡
ÔÚÕâ¸öʱºò½øÐбȽϣ¬Ôì³É¼ÆÊýÆ÷³öÏÖ²»ÏàµÈµÄÇé¿ö¡£¡¡¡¡
±¾Àý½ÒʾÁËʹÓÃÏß³Ìʱһ¸ö·Ç³£»ù±¾µÄÎÊÌâ¡£ÎÒÃǸúÎÞ´ÓÖªµÀÒ»¸öÏß³ÌʲôʱºòÔËÐС£ÏëÏó×Ô¼º×øÔÚÒ»ÕÅ×À¡¡
×ÓÇ°Ã棬×ÀÉÏ·ÅÓÐÒ»°Ñ²æ×Ó£¬×¼±¸²æÆð×Ô¼ºµÄ×îºóÒ»¿éʳÎï¡£µ±²æ×ÓÒªÅöµ½Ê³Îïʱ£¬Ê³ÎïȴͻȻÏûʧÁË£¨Òò¡¡
ΪÕâ¸öÏß³ÌÒѱ»¹ÒÆð£¬Í¬Ê±ÁíÒ»¸öÏ߳̽øÀ´¡°Íµ¡±×ßÁËʳÎ¡£Õâ±ãÊÇÎÒÃÇÒª½â¾öµÄÎÊÌâ¡£¡¡¡¡
ÓеÄʱºò£¬ÎÒÃDz¢²»½éÒâÒ»¸ö×ÊÔ´ÔÚ³¢ÊÔʹÓÃËüµÄʱºòÊÇ·ñÕý±»·ÃÎÊ£¨Ê³ÎïÔÚÁíһЩÅÌ×ÓÀ¡£µ«ÎªÁËÈöࡡ
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡502¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡504¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
Ï̻߳úÖÆÄܹ»Õý³£ÔËת£¬ÐèÒª²ÉȡһЩ´ëÊ©À´·ÀÖ¹Á½¸öÏ̷߳ÃÎÊÏàͬµÄ×ÊÔ´¡ª¡ªÖÁÉÙÔڹؼüµÄʱÆÚ¡£¡¡¡¡
Ϊ·ÀÖ¹³öÏÖÕâÑùµÄ³åÍ»£¬Ö»ÐèÔÚÏß³ÌʹÓÃÒ»¸ö×ÊԴʱΪÆä¼ÓËø¼´¿É¡£·ÃÎÊ×ÊÔ´µÄµÚÒ»¸öÏ̻߳áÆä¼ÓÉÏËøÒÔ¡¡
ºó£¬ÆäËûÏ̱߳㲻ÄÜÔÙʹÓÃÄǸö×ÊÔ´£¬³ý·Ç±»½âËø¡£Èç¹û³µ×ÓµÄÇ°×ùÊÇÓÐÏÞµÄ×ÊÔ´£¬¸ßº°¡°ÕâÊÇÎҵģ¡¡±µÄ¡¡
º¢×Ó»áÖ÷ÕÅ°ÑËüËøÆðÀ´¡£¡¡¡¡
14¡£2¡£2¡¡Java¡¡ÈçºÎ¹²Ïí×ÊÔ´¡¡¡¡
¶ÔÒ»ÖÖÌØÊâµÄ×ÊÔ´¡ª¡ª¶ÔÏóÖеÄÄڴ桪¡ªJava¡¡ÌṩÁËÄÚ½¨µÄ»úÖÆÀ´·ÀÖ¹ËüÃǵijåÍ»¡£ÓÉÓÚÎÒÃÇͨ³£½«Êý¾ÝÔª¡¡
ËØÉèΪ´ÓÊôÓÚprivate¡¡£¨Ë½ÓУ©À࣬Ȼºóֻͨ¹ý·½·¨·ÃÎÊÄÇЩÄڴ棬ËùÒÔÖ»Ð轫һ¸öÌض¨µÄ·½·¨ÉèΪ¡¡
synchronized¡¡£¨Í¬²½µÄ£©£¬±ã¿ÉÓÐЧµØ·ÀÖ¹³åÍ»¡£ÔÚÈκÎʱ¿Ì£¬Ö»¿ÉÓÐÒ»¸öÏ̵߳÷ÓÃÌض¨¶ÔÏóµÄÒ»¸ö¡¡
synchronized·½·¨£¨¾¡¹ÜÄǸöÏ߳̿ÉÒÔµ÷Óöà¸ö¶ÔÏóµÄͬ²½·½·¨£©¡£ÏÂÃæÁгö¼òµ¥µÄsynchronized¡¡·½·¨£º¡¡¡¡
synchronized¡¡void¡¡f£¨£©¡¡£û¡¡/*¡¡¡£¡£¡£¡¡*/¡¡£ý¡¡¡¡
synchronized¡¡void¡¡g£¨£©¡¡£û¡¡/*¡¡¡£¡£¡£¡¡*/¡¡£ý¡¡¡¡
ÿ¸ö¶ÔÏ󶼰üº¬ÁËÒ»°ÑËø£¨Ò²½Ð×÷¡°¼àÊÓÆ÷¡±£©£¬Ëü×Ô¶¯³ÉΪ¶ÔÏóµÄÒ»²¿·Ö£¨²»±ØΪ´ËдÈκÎÌØÊâµÄ´ú¡¡
Â룩¡£µ÷ÓÃÈκΡ¡synchronized·½·¨Ê±£¬¶ÔÏó¾Í»á±»Ëø¶¨£¬²»¿ÉÔÙµ÷ÓÃÄǸö¶ÔÏóµÄÆäËûÈκÎsynchronized¡¡·½¡¡
·¨£¬³ý·ÇµÚÒ»¸ö·½·¨Íê³ÉÁË×Ô¼ºµÄ¹¤×÷£¬²¢½â³ýËø¶¨¡£ÔÚÉÏÃæµÄÀý×ÓÖУ¬Èç¹ûΪһ¸ö¶ÔÏóµ÷ÓÃf£¨£©£¬±ã²»ÄÜ¡¡
ÔÙΪͬÑùµÄ¶ÔÏóµ÷ÓÃg£¨£©£¬³ý·Ç¡¡f£¨£©Íê³É²¢½â³ýËø¶¨¡£Òò´Ë£¬Ò»¸öÌض¨¶ÔÏóµÄËùÓС¡synchronized·½·¨¶¼¹²Ïí¡¡
×ÅÒ»°ÑËø£¬¶øÇÒÕâ°ÑËøÄÜ·ÀÖ¹¶à¸ö·½·¨¶ÔͨÓÃÄÚ´æͬʱ½øÐÐд²Ù×÷£¨±ÈÈçͬʱÓжà¸öỊ̈߳©¡£¡¡¡¡
ÿ¸öÀàÒ²ÓÐ×Ô¼ºµÄÒ»°ÑËø£¨×÷ΪÀàµÄClass¡¡¶ÔÏóµÄÒ»²¿·Ö£©£¬ËùÒÔsynchronized¡¡static¡¡·½·¨¿ÉÔÚÒ»¸öÀàµÄ¡¡
·¶Î§ÄÚ±»Ï໥¼äËø¶¨ÆðÀ´£¬·ÀÖ¹Óë¡¡staticÊý¾ÝµÄ½Ó´¥¡£¡¡¡¡
×¢ÒâÈç¹ûÏë±£»¤ÆäËûijЩ×ÊÔ´²»±»¶à¸öÏß³Ìͬʱ·ÃÎÊ£¬¿ÉÒÔÇ¿ÖÆͨ¹ý¡¡synchronized¡¡·½·ÃÎÊÄÇЩ×ÊÔ´¡£¡¡¡¡
¡¡¡¡
1¡£¡¡¼ÆÊýÆ÷µÄͬ²½¡¡¡¡
×°±¸ÁËÕâ¸öйؼü×Öºó£¬ÎÒÃÇÄܹ»²ÉÈ¡µÄ·½°¸¾Í¸üÁé»îÁË£º¿ÉÒÔֻΪ¡¡TwoCounter¡¡Öеķ½·¨¼òµ¥µØʹÓá¡
synchronized¹Ø¼ü×Ö¡£ÏÂÃæÕâ¸öÀý×ÓÊǶÔÇ°ÀýµÄ¸Ä°æ£¬ÆäÖмÓÈëÁËеĹؼü×Ö£º¡¡¡¡
¡¡¡¡
//£º¡¡Sharing2¡£java¡¡¡¡
//¡¡Using¡¡the¡¡synchronized¡¡keyword¡¡to¡¡prevent¡¡¡¡
//¡¡multiple¡¡access¡¡to¡¡a¡¡particular¡¡resource¡£¡¡¡¡
import¡¡java¡£awt¡£*£»¡¡¡¡
import¡¡java¡£awt¡£event¡£*£»¡¡¡¡
import¡¡java¡£applet¡£*£»¡¡¡¡
¡¡¡¡
class¡¡TwoCounter2¡¡extends¡¡Thread¡¡£û¡¡¡¡
¡¡¡¡private¡¡boolean¡¡started¡¡=¡¡false£»¡¡¡¡
¡¡¡¡private¡¡TextField¡¡¡¡¡¡
¡¡¡¡¡¡¡¡t1¡¡=¡¡new¡¡TextField£¨5£©£»¡¡¡¡
¡¡¡¡¡¡¡¡t2¡¡=¡¡new¡¡TextField£¨5£©£»¡¡¡¡
¡¡¡¡private¡¡Label¡¡l¡¡=¡¡¡¡¡¡
¡¡¡¡¡¡¡¡new¡¡Label£¨¡¨count1¡¡==¡¡count2¡¨£©£»¡¡¡¡
¡¡¡¡private¡¡int¡¡count1¡¡=¡¡0£»¡¡count2¡¡=¡¡0£»¡¡¡¡
¡¡¡¡public¡¡TwoCounter2£¨Container¡¡c£©¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡Panel¡¡p¡¡=¡¡new¡¡Panel£¨£©£»¡¡¡¡
¡¡¡¡¡¡¡¡p¡£add£¨t1£©£»¡¡¡¡
¡¡¡¡¡¡¡¡p¡£add£¨t2£©£»¡¡¡¡
¡¡¡¡¡¡¡¡p¡£add£¨l£©£»¡¡¡¡
¡¡¡¡¡¡¡¡c¡£add£¨p£©£»¡¡¡¡
¡¡¡¡£ý¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡public¡¡void¡¡start£¨£©¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡if£¨£¡started£©¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡started¡¡=¡¡true£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡super¡£start£¨£©£»¡¡¡¡
¡¡¡¡¡¡¡¡£ý¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡503¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡505¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡£ý¡¡¡¡
¡¡¡¡public¡¡synchronized¡¡void¡¡run£¨£©¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡while¡¡£¨true£©¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡t1¡£setText£¨Integer¡£toString£¨count1£«£«£©£©£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡t2¡£setText£¨Integer¡£toString£¨count2£«£«£©£©£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡try¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡sleep£¨500£©£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡£ý¡¡catch¡¡£¨InterruptedException¡¡e£©£û£ý¡¡¡¡
¡¡¡¡¡¡¡¡£ý¡¡¡¡
¡¡¡¡£ý¡¡¡¡
¡¡¡¡public¡¡synchronized¡¡void¡¡synchTest£¨£©¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡Sharing2¡£incrementAccess£¨£©£»¡¡¡¡
¡¡¡¡¡¡¡¡if£¨count1¡¡£¡=¡¡count2£©¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡l¡£setText£¨¡¨Unsynched¡¨£©£»¡¡¡¡
¡¡¡¡£ý¡¡¡¡
£ý¡¡¡¡
¡¡¡¡
class¡¡Watcher2¡¡extends¡¡Thread¡¡£û¡¡¡¡
¡¡¡¡private¡¡Sharing2¡¡p£»¡¡¡¡
¡¡¡¡public¡¡Watcher2£¨Sharing2¡¡p£©¡¡£û¡¡¡¡¡¡
¡¡¡¡¡¡¡¡this¡£p¡¡=¡¡p£»¡¡¡¡
¡¡¡¡¡¡¡¡start£¨£©£»¡¡¡¡
¡¡¡¡£ý¡¡¡¡
¡¡¡¡public¡¡void¡¡run£¨£©¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡while£¨true£©¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡for£¨int¡¡i¡¡=¡¡0£»¡¡i¡¡¡¶¡¡p¡£s¡£length£»¡¡i£«£«£©¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡p¡£s£§i£§¡£synchTest£¨£©£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡try¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡sleep£¨500£©£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡£ý¡¡catch¡¡£¨InterruptedException¡¡e£©£û£ý¡¡¡¡
¡¡¡¡¡¡¡¡£ý¡¡¡¡
¡¡¡¡£ý¡¡¡¡
£ý¡¡¡¡
¡¡¡¡
public¡¡class¡¡Sharing2¡¡extends¡¡Applet¡¡£û¡¡¡¡
¡¡¡¡TwoCounter2£§£§¡¡s£»¡¡¡¡
¡¡¡¡private¡¡static¡¡int¡¡accessCount¡¡=¡¡0£»¡¡¡¡
¡¡¡¡private¡¡static¡¡TextField¡¡aCount¡¡=¡¡¡¡¡¡
¡¡¡¡¡¡¡¡new¡¡TextField£¨¡¨0¡¨£»¡¡10£©£»¡¡¡¡
¡¡¡¡public¡¡static¡¡void¡¡incrementAccess£¨£©¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡accessCount£«£«£»¡¡¡¡
¡¡¡¡¡¡¡¡aCount¡£setText£¨Integer¡£toString£¨accessCount£©£©£»¡¡¡¡
¡¡¡¡£ý¡¡¡¡
¡¡¡¡private¡¡Button¡¡¡¡¡¡
¡¡¡¡¡¡¡¡start¡¡=¡¡new¡¡Button£¨¡¨Start¡¨£©£»¡¡¡¡
¡¡¡¡¡¡¡¡observer¡¡=¡¡new¡¡Button£¨¡¨Observe¡¨£©£»¡¡¡¡
¡¡¡¡private¡¡boolean¡¡isApplet¡¡=¡¡true£»¡¡¡¡
¡¡¡¡private¡¡int¡¡numCounters¡¡=¡¡0£»¡¡¡¡
¡¡¡¡private¡¡int¡¡numObservers¡¡=¡¡0£»¡¡¡¡
¡¡¡¡public¡¡void¡¡init£¨£©¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡if£¨isApplet£©¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡numCounters¡¡=¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡504¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡506¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Integer¡£parseInt£¨getParameter£¨¡¨size¡¨£©£©£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡numObservers¡¡=¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Integer¡£parseInt£¨¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡getParameter£¨¡¨observers¡¨£©£©£»¡¡¡¡
¡¡¡¡¡¡¡¡£ý¡¡¡¡
¡¡¡¡¡¡¡¡s¡¡=¡¡new¡¡TwoCounter2£§numCounters£§£»¡¡¡¡
¡¡¡¡¡¡¡¡for£¨int¡¡i¡¡=¡¡0£»¡¡i¡¡¡¶¡¡s¡£length£»¡¡i£«£«£©¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡s£§i£§¡¡=¡¡new¡¡TwoCounter2£¨this£©£»¡¡¡¡
¡¡¡¡¡¡¡¡Panel¡¡p¡¡=¡¡new¡¡Panel£¨£©£»¡¡¡¡
¡¡¡¡¡¡¡¡start¡£addActionListener£¨new¡¡StartL£¨£©£©£»¡¡¡¡
¡¡¡¡¡¡¡¡p¡£add£¨start£©£»¡¡¡¡
¡¡¡¡¡¡¡¡observer¡£addActionListener£¨new¡¡ObserverL£¨£©£©£»¡¡¡¡
¡¡¡¡¡¡¡¡p¡£add£¨observer£©£»¡¡¡¡
¡¡¡¡¡¡¡¡p¡£add£¨new¡¡Label£¨¡¨Access¡¡Count¡¨£©£©£»¡¡¡¡
¡¡¡¡¡¡¡¡p¡£add£¨aCount£©£»¡¡¡¡
¡¡¡¡¡¡¡¡add£¨p£©£»¡¡¡¡
¡¡¡¡£ý¡¡¡¡
¡¡¡¡class¡¡StartL¡¡implements¡¡ActionListener¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡public¡¡void¡¡actionPerformed£¨ActionEvent¡¡e£©¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡for£¨int¡¡i¡¡=¡¡0£»¡¡i¡¡¡¶¡¡s¡£length£»¡¡i£«£«£©¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡s£§i£§¡£start£¨£©£»¡¡¡¡
¡¡¡¡¡¡¡¡£ý¡¡¡¡
¡¡¡¡£ý¡¡¡¡
¡¡¡¡class¡¡ObserverL¡¡implements¡¡ActionListener¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡public¡¡void¡¡actionPerformed£¨ActionEvent¡¡e£©¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡for£¨int¡¡i¡¡=¡¡0£»¡¡i¡¡¡¶¡¡numObservers£»¡¡i£«£«£©¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡new¡¡Watcher2£¨Sharing2¡£this£©£»¡¡¡¡
¡¡¡¡¡¡¡¡£ý¡¡¡¡
¡¡¡¡£ý¡¡¡¡
¡¡¡¡public¡¡static¡¡void¡¡main£¨String£§£§¡¡args£©¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡Sharing2¡¡applet¡¡=¡¡new¡¡Sharing2£¨£©£»¡¡¡¡
¡¡¡¡¡¡¡¡//¡¡This¡¡isn't¡¡an¡¡applet£»¡¡so¡¡set¡¡the¡¡flag¡¡and¡¡¡¡
¡¡¡¡¡¡¡¡//¡¡produce¡¡the¡¡parameter¡¡values¡¡from¡¡args£º¡¡¡¡
¡¡¡¡¡¡¡¡applet¡£isApplet¡¡=¡¡false£»¡¡¡¡
¡¡¡¡¡¡¡¡applet¡£numCounters¡¡=¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡£¨args¡£length¡¡==¡¡0¡¡£¿¡¡5¡¡£º¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Integer¡£parseInt£¨args£§0£§£©£©£»¡¡¡¡
¡¡¡¡¡¡¡¡applet¡£numObservers¡¡=¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡£¨args¡£length¡¡¡¶¡¡2¡¡£¿¡¡5¡¡£º¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Integer¡£parseInt£¨args£§1£§£©£©£»¡¡¡¡
¡¡¡¡¡¡¡¡Frame¡¡aFrame¡¡=¡¡new¡¡Frame£¨¡¨Sharing2¡¨£©£»¡¡¡¡
¡¡¡¡¡¡¡¡aFrame¡£addWindowListener£¨¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡new¡¡WindowAdapter£¨£©¡¡£û¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡public¡¡void¡¡windowClosing£¨WindowEvent¡¡e£©£û¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡System¡£exit£¨0£©£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡£ý¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡£ý£©£»¡¡¡¡
¡¡¡¡¡¡¡¡aFrame¡£add£¨applet£»¡¡BorderLayout¡£CENTER£©£»¡¡¡¡
¡¡¡¡¡¡¡¡aFrame¡£setSize£¨350£»¡¡applet¡£numCounters¡¡*100£©£»¡¡¡¡
¡¡¡¡¡¡¡¡applet¡£in¡¡it£¨£©£»¡¡¡¡
¡¡¡¡¡¡¡¡applet¡£start£¨£©£»¡¡¡¡
¡¡¡¡¡¡¡¡aFrame¡£setVisible£¨true£©£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡505¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡507¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡£ý¡¡¡¡
£ý¡¡///£º~¡¡¡¡
¡¡¡¡
ÎÒÃÇ×¢Òâµ½ÎÞÂÛrun£¨£©»¹ÊÇ¡¡synchTest£¨£©¶¼ÊÇ¡°Í¬²½µÄ¡±¡£Èç¹ûֻͬ²½ÆäÖеÄÒ»¸ö·½·¨£¬ÄÇôÁíÒ»¸ö¾Í¿ÉÒÔ×Ô¡¡
ÓɺöÊÓ¶ÔÏóµÄËø¶¨£¬²¢¿ÉÎÞ°µØµ÷Óá£ËùÒÔ±ØÐë¼Çסһ¸öÖØÒªµÄ¹æÔò£º¶ÔÓÚ·ÃÎÊij¸ö¹Ø¼ü¹²Ïí×ÊÔ´µÄËùÓз½¡¡
·¨£¬¶¼±ØÐë°ÑËüÃÇÉèΪ¡¡synchronized£¬·ñÔò¾Í²»ÄÜÕý³£µØ¹¤×÷¡£¡¡¡¡
ÏÖÔÚÓÖÓöµ½ÁËÒ»¸öÐÂÎÊÌâ¡£Watcher2¡¡ÓÀÔ¶¶¼²»ÄÜ¿´µ½ÕýÔÚ½øÐеÄÊÂÇ飬ÒòΪÕû¸örun£¨£©·½·¨ÒÑÉèΪ¡°Í¬¡¡
²½¡±¡£¶øÇÒÓÉÓڿ϶¨ÒªÎªÃ¿¸ö¶ÔÏóÔËÐÐrun£¨£©£¬ËùÒÔËøÓÀÔ¶²»ÄÜ´ò¿ª£¬¶øsynchTest£¨£©ÓÀÔ¶²»»áµÃµ½µ÷Óá£Ö®¡¡
ËùÒÔÄÜ¿´µ½ÕâÒ»½á¹û£¬ÊÇÒòΪaccessCount¡¡¸ù±¾Ã»Óб仯¡£¡¡¡¡
Ϊ½â¾öÕâ¸öÎÊÌ⣬ÎÒÃÇÄܲÉÈ¡µÄÒ»¸ö°ì·¨ÊÇÖ»½«run£¨£©ÖеÄÒ»²¿·Ö´úÂë¸ôÀë³öÀ´¡£ÏëÓÃÕâ¸ö°ì·¨¸ôÀë³öÀ´µÄ¡¡
ÄDz¿·Ö´úÂë½Ð×÷¡°¹Ø¼üÇøÓò¡±£¬¶øÇÒÒªÓò»Í¬µÄ·½Ê½À´Ê¹Óá¡synchronized¹Ø¼ü×Ö£¬ÒÔÉèÖÃÒ»¸ö¹Ø¼üÇøÓò¡£¡¡
Java¡¡Í¨¹ý¡°Í¬²½¿é¡±Ìṩ¶Ô¹Ø¼üÇøÓòµÄÖ§³Ö£»ÕâÒ»´Î£¬ÎÒÃÇÓá¡synchronized¹Ø¼ü×ÖÖ