熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java線程模型缺陷研究[5]

2022-06-13   來源: Java高級技術 

    現有的覆蓋(override)Thread 對象並實現 run() 的習慣繼續有效但是它應映射到一個被綁定到一輕便進程的綠色線程(在 Thread() 類中的缺省 run() 方法會在內部有效地創建第二個 Runnable 對象

    線程間的協作

    應在語言中加入更多的功能以支持線程間的相互通信目前PipedInputStream 和 PipedOutputStream 類可用於這個目的但是對於大多數應用程序它們太弱了我建議向 Thread 類加入下列函數 增加一個 wait_for_start() 方法它通常處於阻塞狀態直到一個線程的 run() 方法啟動(如果等待的線程在調用 run 之前被釋放這沒有什麼問題)用這種方法一個線程可以創建一個或多個輔助線程並保證在創建線程繼續執行操作之前這些輔助線程會處於運行狀態 (向 Object 類)增加 $send (Object o) 和 Object=$receive() 方法它們將使用一個內部阻斷隊列在線程之間傳送對象阻斷隊列應作為第一個 $send() 調用的副產品被自動創建 $send() 調用會把對象加入隊列 $receive() 調用通常處於阻塞狀態直到有一個對象被加入隊列然後它返回此對象這種方法中的變量應支持設定入隊和出隊的操作超時能力 $send (Object o long timeout) 和 $receive (long timeout)

    對於讀寫鎖的內部支持

    讀寫鎖的概念應內置到 Java 編程語言中讀寫器鎖在Taming Java Threads (和其它地方)中有詳細討論概括地說一個讀寫鎖支持多個線程同時訪問一個對象但是在同一時刻只有一個線程可以修改此對象並且在訪問進行時不能修改

    對於一個對象應該只有在$writing 塊中沒有線程時才支持多個線程進入 $reading 塊在進行讀操作時一個試圖進入 $writing 塊的線程會被阻斷直到讀線程退出 $reading 塊 當有其它線程處於 $writing 塊時試圖進入 $reading 或 $writing 塊的線程會被阻斷直到此寫線程退出 $writing 塊

    如果讀和寫線程都在等待缺省情況下讀線程會首先進行但是可以使用$writer_priority 屬性修改類的定義來改變這種缺省方式

    訪問部分創建的對象應是非法的

    當前情況下JLS 允許訪問部分創建的對象例如在一個構造函數中創建的線程可以訪問正被創建的對象既使此對象沒有完全被創建

    設置x 為 的線程可以和設置 x 為 的線程同時進行所以此時 x 的值無法預測

    對此問題的一個解決方法是在構造函數沒有返回之前對於在此構造函數中創建的線程既使它的優先級比調用new 的線程高也要禁止運行它的 run() 方法

    這就是說在構造函數返回之前start() 請求必須被推遲

    另外Java 編程語言應可允許構造函數的同步換句話說下面的代碼(在當前情況下是非法的)會象預期的那樣工作

    我認為第一種方法比第二種更簡潔但實現起來更為困難

    volatile關鍵字應象預期的那樣工作

    JLS 要求保留對於 volatile 操作的請求大多數 Java 虛擬機都簡單地忽略了這部分內容這是不應該的在多處理器的情況下許多主機都出現了這種問題但是它本應由 JLS 加以解決的如果您對這方面感興趣馬裡蘭大學的 Bill Pugh 正在致力於這項工作(請參閱參考資料 )

[]  []  []  []  []  []  []  


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27694.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.