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