<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Evan's Blog

    Java, software development and others.

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      28 隨筆 :: 0 文章 :: 73 評論 :: 0 Trackbacks
    看到《Java Threads》第5章,介紹了JDK 1.5新加的一些所謂原子類(Atomic Classes),總感覺有點為原子而原子,實際操作中,又有多少人會為了少許的性能提升而刻意去用這些別扭的操作而放棄直觀的synchronize關(guān)鍵字或者Lock類呢?不過,這里不是想討論這個,而是當其用Atomic Classes來改造它的打字程序后,解釋用原子類只是保證類似遞增、遞減、賦值等操作的原子性,而不能保證其所在的方法一定是線程安全的,然后說,有可能按鍵事件的處理可能需要等待resetScore()處理完才能執(zhí)行,而這會導致錯誤的評分(被當成多敲了鍵)。由于前幾章的內(nèi)容相對比較簡單易懂,所以也沒有很仔細的運行那些例子。這里為了驗證一下,就運行了一下第4章的例子,然后發(fā)現(xiàn),基本上第一次的評分總是錯的。這就引起了我的注意,因為,一般情況下,如果是race condition導致的錯誤是很難重現(xiàn)的,這么明顯的錯誤很可能是程序邏輯上的錯誤。仔細看了一下代碼,發(fā)現(xiàn)在start按鈕的事件處理方法里,有下面這樣一段代碼:
    startButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                    displayCanvas.setDone(false);
                    producer.setDone(false);
                    startButton.setEnabled(false);
                    stopButton.setEnabled(true);
                    feedbackCanvas.setEnabled(true);
                    feedbackCanvas.requestFocus();
                    score.resetScore();
                }
            });
    注意重置成績的調(diào)用放在了最后,此時,隨機生成字符的線程應(yīng)該被喚醒并產(chǎn)生了第一個字符,然后,resetScore()將需要輸入的字符又設(shè)成了-1,所以,當你第一次輸入字符時,總是被認為是多擊了一次鍵而扣1分:(。既然這樣,那停止然后再啟動也應(yīng)該會發(fā)生這個錯誤啊。而事實上的確是這樣。我想,這不應(yīng)該看做是race condition吧,有什么樣的同步技術(shù)能夠避免這個問題呢?除非另外弄個標志,當成績沒有被重置前,不能產(chǎn)生第一個字符。當然,這是不需要的,只要將score.resetScore()放到第一句就可以了。

    然后又運行了第3章的例子,發(fā)現(xiàn)基本上沒有這個問題。難道第3章的代碼是正確的?打開源代碼一看,重置成績的方法還是放在最后,那這里為什么又是正確的呢?我想,大約是第3章的例子中,每次點擊start按鈕,都重新創(chuàng)建一個線程對象的原因吧。由于創(chuàng)建對象和初始化線程需要一定的時間,剛好給了主線程重置成績的機會。

    不知道作者有意為之呢,還是疏忽,不過,這樣的錯誤不能算是race condition的例子。
    posted on 2006-03-09 22:11 Evan 閱讀(847) 評論(0)  編輯  收藏 所屬分類: Java筆記
    主站蜘蛛池模板: 亚洲免费视频在线观看| 亚洲综合色丁香婷婷六月图片| 亚洲国产综合在线| 国产高潮久久免费观看| 日本无吗免费一二区| 亚洲色欲色欲www在线丝| 老子影院午夜伦不卡亚洲| 最近最新MV在线观看免费高清| 亚洲国产精华液网站w| 色哟哟国产精品免费观看| 日韩在线a视频免费播放| 亚洲乱码一二三四五六区| 久久综合给合久久国产免费| 亚洲中文字幕无码久久精品1| 看免费毛片天天看| 免费看香港一级毛片| 亚洲日韩一区精品射精| 永久免费的网站在线观看| 亚洲成无码人在线观看| 永久免费在线观看视频| 久久亚洲AV无码精品色午夜| 波霸在线精品视频免费观看| 亚洲性在线看高清h片| 国产天堂亚洲精品| 亚洲第一区精品观看| 亚洲av无码国产精品色在线看不卡| 亚洲综合激情另类小说区| 外国成人网在线观看免费视频| 久久夜色精品国产嚕嚕亚洲av| 亚洲成a人片在线观| ww4545四虎永久免费地址| 亚洲国产成人久久综合一| 88xx成人永久免费观看| 4444亚洲国产成人精品| 99re6热视频精品免费观看| 亚洲成年网站在线观看| 亚洲一区二区三区无码影院| 日韩免费电影网站| 国产亚洲色婷婷久久99精品| 黄色永久免费网站| 免费国产va视频永久在线观看|