1. 程式人生 > >Java併發程式設計——this引用逸出("this" Escape)

Java併發程式設計——this引用逸出("this" Escape)

        程式碼清單4是個普通的消費執行緒的客戶端程式,它先啟動了一個ListenerRunnable 執行緒,用於監視ThisEscape的內部狀態。緊接著呼叫ThisEscape的建構函式,新建一個ThisEscape物件。在ThisEscape建構函式中,如果在source.registerListener語句之後,name="flysqrlboy"賦值語句之前正好發生上下文切換(如圖1),ListenerRunnable 執行緒就有可能看到了還沒初始化完的ThisEscape物件--即id為1,但是name仍然為null!雖然正好在這個點上發生上下文切換是“偶然”事件,但理論上它是存在的。而這正是併發程式設計令人頭疼的地方--平時好好的,但有時候就莫名其妙的失敗了!而且還很難找出原因。為了使本例的this引用逸出容易被觀察到,我們試圖改造一下ThisEscape的建構函式(程式碼清單5),假設在source.registerListener和name賦值語句之間,還有其他的初始化操作,而且是比較耗時的。我們用一個sleep方法來模擬這樣的耗時操作。經過這樣的改造後,this引用逸出幾乎是必然出現的--id等於1,name等於null。