Java編程語言如何完善自己的缺點
Java編程語言如何才能保證自己的相關缺點不會影響在實際的使用呢?下面我們就看看如何才能更好的完善Java編程語言的相關缺點。我前面提到過,必須調用新創建的線程的 start() 方法來啟動它的執行。
但是,僅僅是調用 start() 方法并不意味著線程會立即開始運行。這個方法只是把線程的狀態從 new 變成 runnable。只有在操作系統真正安排線程執行的時候,線程狀態才會變成 running (從 runnable)。
Java編程語言常見缺陷
正如我已經展示過的,Java編程語言中的多線程編程是通過語言支持的大量精心設計的構造實現的。另外,還設計了大量設計模式和指導原則,來幫助人們了解這種復雜性帶來的許多缺陷。除此之外,多線程編程會很容易地在不經意間把細微的 bug 帶進多線程代碼,而且更重要的是,這類問題分析和調試起來非常困難。接下來要介紹的是用 Java 語言進行多線程編程時將會遇到(或者可能已經遇到過)的最常見問題的一個列表。#t#
Java編程語言爭用條件
據說 爭用條件 存在于這樣的系統中:多個線程之間存在對共享資源的競爭,而勝出者決定系統的行為。Allen Holub 在他撰寫的文章 “programming Java threads in the real world” 提供了一個帶有這樣 bug 的簡單的多線程程序示例。在沖突的訪問請求之間進行不正確同步的另一個更可怕的后果是 數據崩潰,此時,共享的數據結構有一部分由一個線程更新,而另一部分由另一個線程更新。在這種情況下,系統的行為不是按照勝出線程的意圖進行,系統根本不按照任何一個線程的意圖行動,所以兩個線程***都將以失敗告終。
Java編程語言死鎖
死鎖 的情況是指:線程由于等候某種條件變成真(例如資源可以使用),但是它等候的條件無法變成真,因為能夠讓條件變成真的線程在等候***個線程“做某件事”。這樣,兩個線程都在等候對方先采取***步,所以都無法做事。
Java編程語言活動鎖
活動鎖 與 死鎖 不同,它是在線程實際工作的時候發生的,但這時還沒有完成工作。這通常是在兩個線程交叉工作的時候發生,所以***個線程做的工作被另一個線程取消。一個簡單的示例就是:每個線程已經擁有了一個對象,同時需要另外一個線程擁有的另外一個對象。可以想像這樣的情況:每個線程放下自己擁有的對象,撿起另外一個線程放下的對象。顯然,這兩個線程會永遠都運行在上鎖這一步操作上,結果是什么都做不成。(常見的真實示例就是,兩個人在狹窄的走廊相遇。每個人都禮貌地讓到另一邊讓對方先行,但卻在相同的時間都讓到同一邊了,所以兩個人還都沒法通過。這種情況會持續一些時間,然后兩個人都從這邊閃到那邊,結果還是一點進展也沒有。)