沙漠中的魚

          欲上天堂,先下地獄
          posts - 0, comments - 56, trackbacks - 0, articles - 119
            BlogJava :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理
          事件監(jiān)聽的安全性
          如下代碼,在用Vector進(jìn)行不安全的迭代時(shí),另外一個(gè)線程對(duì)Vector的對(duì)象進(jìn)行添加或刪除時(shí),會(huì)拋出會(huì)拋出 ConcurrentModificationException異常。
          Vector<Listener> v;
          for (int i=0; i<v.size(); i++)
            v.get(i).eventHappened(event);
          java.util.concurrent 中的 CopyOnWriteArrayList 類,能夠幫助防止這個(gè)問題。它實(shí)現(xiàn)了 List,而且是線程安全的,但是它的迭代器不會(huì)拋出 ConcurrentModificationException,遍歷期間也不要求額外的鎖定。這種特性組合是通過在每次列表修改時(shí),在內(nèi)部重新分配并拷貝列表內(nèi)容而實(shí)現(xiàn)的,這樣,遍歷內(nèi)容的線程不需要處理變化 —— 從它們的角度來說,列表的內(nèi)容在遍歷期間保持不變。雖然這聽起來可能沒效率,但是請(qǐng)記住,在多數(shù)觀察者情況下,每個(gè)組件只有少量偵聽器,遍歷的數(shù)量遠(yuǎn)遠(yuǎn)超過插入和刪除的數(shù)量。所以更快的迭代可以補(bǔ)償較慢的變化過程,并提供更好的并發(fā)性,因?yàn)槎鄠€(gè)線程可以同時(shí)迭代列表。
          事件監(jiān)聽初使化風(fēng)險(xiǎn)
          事件監(jiān)聽器允許"this"轉(zhuǎn)義
          失效的監(jiān)聽
            public void processFile(String filename) throws IOException {
              cancelButton.registerListener(this);
              // open file, read it, process it
              // might throw IOException
              cancelButton.unregisterListener(this);
            }
          當(dāng)讀入文件時(shí),產(chǎn)生異常,會(huì)造成取消注冊(cè)事件不能被執(zhí)行,取消登記的操作應(yīng)當(dāng)在 finally 塊中進(jìn)行,這樣,processFile() 方法的所有出口都會(huì)執(zhí)行它。
          主站蜘蛛池模板: 丹东市| 乌什县| 博罗县| 永春县| 肥乡县| 岳普湖县| 昭觉县| 灌云县| 白沙| 宝应县| 平南县| 酉阳| 河北省| 江津市| 武胜县| 望奎县| 太仆寺旗| 平罗县| 毕节市| 贺州市| 祁阳县| 崇阳县| 西峡县| 连平县| 汝城县| 容城县| 合山市| 望城县| 扶余县| 城市| 昂仁县| 恩平市| 锦州市| 阳西县| 耿马| 哈尔滨市| 咸宁市| 怀宁县| 海口市| 安塞县| 安泽县|