線程的同步問題(java)

1,使用synchronized 關鍵字
     synchronized關鍵字可以修飾方法,當修飾方法的時候,多個被修飾的方法只能被一個線程訪問
     
     synchronized關鍵字修飾代碼段

    synchronized(this)
     {
...
     }
2.  在任何可能的情況下使用局部變量代替字段,局部變量完全沒有同步額外難題。每次進入一個方法的時候,虛擬機降維該方法創建全新的局部變量   集合。這些變量在方法外是不可見的,在方法退出的時候被銷燬。這樣,一個局部變量就不會被用在兩個線程上,每個線程都有自己的局部變量集。

3. 在自己的類中利用不可變性。 簡單類型的參數對於單個線程修改是安全的,因爲java通過值而不是通過引用來傳遞參數。以簡單類型爲形參的方法是線程安全的。
    不可變類是安全的。例如String,Integer,Double類等,因爲這些類不能被任何類所修改
    要讓一個方法是線程安全的,這是通常的最簡單的方法。

4.  只將非線程安全的類作爲線程安全類的一個私有字段。這樣,只要包含類僅以線程安全的方式訪問此非安全類,並且永遠不讓這個私有字段的引用泄漏到另一個對象中,那麼這個類就是安全的。 web服務器使用非同步的LogFile類,但是爲每個單獨的線程提供自己單獨的日誌,這樣每個線程之間就不會有共享的資源。

關於wait() notify() 方法。在某些人看來,這個是可以解決同步問題的,然而另外一些人卻不這麼認爲
wait 用來使線程休眠,去等待另外一個它鎖定的對象。在等待時,它會釋放此對象的鎖,並暫停,等待其他線程的通知。
當 時間到期,線程被中斷,對象得到通知的時候將會被喚醒
wait方法可以用來互斥的使用資源,例如,多線程爬蟲程序。多個線程競爭一個url List。在使用wait的同時,也需要每個線程競爭的方式對url List加鎖(Synchronized)。可見 wait方法並非用來解決同步問題的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章