簡體   English   中英

什么是“不一致狀態”?

[英]What is "inconsistent state"?

閱讀有關為什么不推薦使用Thread.stop()的信息,

因為它本質上是不安全的。 停止線程會導致它解鎖所有已鎖定的監視器。 (隨着 ThreadDeath 異常在堆棧中向上傳播,監視器被解鎖。)如果以前受這些監視器保護的任何對象處於不一致的 state 中,其他線程現在可能會在不一致的 state 中查看這些對象。這樣的對象被稱為已損壞. 當線程對損壞的對象進行操作時,可能會導致任意行為。 這種行為可能很微妙且難以察覺,也可能很明顯。 與其他未經檢查的異常不同,ThreadDeath 會默默地殺死線程; 因此,用戶不會收到有關他的程序可能已損壞的警告。 損壞可能在實際損壞發生后的任何時間出現,甚至在未來數小時或數天之后。

我遇到過不一致的 state語句。 我試圖使用谷歌來了解它的含義。 我只找到了這個答案,但它似乎與我的情況無關。

通過調用其stop()方法,可以隨時終止線程。 所以結果就是線程沒有被殺死警告 特別是,一個線程在被殺死時可能正在執行一些關鍵操作 如果這發生在關鍵操作尚未完成時,那么它在被殺死時使用的任何數據和資源都可能留在不一致的 state中。 這樣的物體被稱為“損壞的” 數據損壞可能會在實際損壞發生后的任何時間出現,甚至在未來數小時或數天之后。

字典上說:

不一致

缺乏一致性:例如

  • 與另一個事實或主張不相符

    “不一致的陳述”

在計算機科學中,state 如果自相矛盾,就是不一致的。 例如,由於信息存儲在多個 forms 中,更新信息的代碼成功更新了一個表單,但在更新另一個表單之前就被殺死了。

例如,考慮這段代碼:

synchronized void add(Listener l) {
    listeners[listenerCount++] = l;
}

如果線程在增加 listenerCount 之后但在寫入數組元素之前被終止,則 object 與 state 不一致,因為 listenerCount 比數組知道更多的偵聽器。 如果有其他代碼:

synchronized notifyListeners() {
    for (int i = 0; i < listenerCount; i++) {
        listeners[i].changed();
    }
}

令人驚訝的是,它可能會因NullPointerException而失敗。

通常, synchronized修飾符會阻止另一個線程在更新時訪問 object。 但是如果線程突然死亡,它會在清理它造成的混亂之前離開同步塊,這會解鎖監視器,並允許其他線程使用 object,並且可能會被死亡線程留下的混亂絆倒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM