《java7核心技術與最佳實踐》讀書筆記之 multi-thread (2)

基本thread的同步方式
java

    對於多thread中存在的數據競爭,須要利用java平臺提供的同步機制來確保對共享變量的訪問存在合適的「在以前發生」(happens-before)的順序。java平臺提供的基本同步方式包括synchronized關鍵詞和object類中提供的wait,notify和notifyAll方法。
緩存

    synchronized,能夠添加到方法或代碼塊之上。聲明爲synchronized的方法或代碼塊在同一時刻只能有一個thread容許訪問。若是當前已有thread正在訪問,那麼其餘試圖訪問該方法或代碼塊的thread會處於等待狀態。全部的java對象都有一個與之關聯的監視器對象monitor。容許thread在該monitor對象上進行加鎖和解鎖操做。jvm在鎖被釋放時,對共享變量的修改會從cpu緩存中直接寫回到主存中,當鎖被獲取時,cpu的緩存中的內容被置爲無效狀態,直接從主存中從新讀取共享變量的值。
app

    正確的使用synchronized是把方法中須要同步的代碼用synchronized代碼塊包圍便可。
jvm


    Object類的wait,notify,notifyAll方法
性能

    synchronized關鍵字主要用來實現thread間互斥,即同一時刻只有一個thread容許執行特定代碼。thread間也須要經過協做的方式來完成某些任務。在典型的生產者和消費者場景中。生產者thread在緩衝區已滿時須要等待,等消費者thread從緩衝區中取走數據後再進行生產,消費者thread在緩衝區已空時須要等待,等生產者thread向緩衝區放入數據後再進行消費。這種協做方式能夠抽象爲等待-通知機制。在thread運行時可能須要知足某些條件才能繼續進行。當條件不知足時,thread進入等待狀態,等待其餘thread運行而使條件獲得知足。其餘thread負責在合適的時機發出通知來喚醒處於等待狀態的thread。能夠用while循環和volatile變量來處理這個場景。但這種作法本質上是讓thread處於忙等待狀態,並經過輪詢方式來判斷條件是否知足。此時thread仍然須要打敗cpu時間,會對性能形成影響。更好的作法是使用Object的wait,notify,notifyAll方法。
線程

    能夠調用任意java對象的wait方法,java中每一個對象除了有與之相關聯的監視器對象以外,還有一個與之關聯的包含thread的等待集合。在調用wait方法時,該方法調用的接收者所關聯的監視器對象是所使用的監視器對象,同時wait方法所影響的是執行wait方法調用的當前thread。因爲wait方法的成功調用須要當前thread持有監視器對象上的鎖,所以wait方法調用須要放在使用synchronized聲明的方法或代碼塊中。
對象

    經過調用wait方法進行等待狀態分爲無超時和有超時兩種。若是thread處於有超時等待狀態,則thread能夠被主動喚醒而離開等待狀態以外,設定的超時時間事後也會自動離開等待狀態。在設定超時時間時能夠指定毫秒數和納秒數。
資源

    wait方法的做用是使當前thread進行等待狀態。對應的notify,notifyall方法用來通知thread離開等待狀態。notify會從該對象關聯的等待集合中選擇一個thread來喚醒。被喚醒的thread和其餘thread競爭運行機會。notifyall方法會喚醒相關集合中全部threads。所以當等待集合中可能包含多個threads時,通常使用notifyall方法。
get

須要把wait方法調用置於循環之中。同步

synchronized(obj){

    while(/*logic condition 不知足*/){

    obj.wait();

}

}

線程狀態:

    不一樣thread狀態由枚舉類型Thread.State來表示。可能過Thread類的getState方法來獲得。它只表示jvm中thread的狀態,並不表示對應os上thread的狀態。

    1 NEW:thread剛被建立出來

    2 RUNNABLE:thread處於可運行狀態。此時thread有可能正在運行,也有可能在等待其餘資源中。

    3    BLOCKED:thread在等待一個監視器對象上的鎖時,處於此狀態。當一thread嘗試執行聲明爲synchronized方法或代碼塊,又沒法獲取對應的鎖時,處於此狀態。

    4     WAITING:調用某些方法會使當前thread進入等待狀態。這個等待沒有超時時間,處於此狀態的thread等待其餘thread執行特定操做來使當前thread退出等待狀態。

     5    TIMED_WAITING:此狀態相似於4狀態,可是增長了指定的超時時間。當超時時間過去,但thread等待的條件仍然沒有發生,則thread也會退出等待狀態。

    6 TERMINATED:thread的運行已終止。

    thread在同一時刻只能處於上述6種狀態中的一種。

相關文章
相關標籤/搜索