1. 程式人生 > >讀書筆記:解決共享資源的競爭

讀書筆記:解決共享資源的競爭

1.基本上所有的併發模式在解決執行緒衝突,都採用序列化訪問共享資源的方案,意味著在給定時刻只允許一個任務訪問共享資源。通常就是在程式碼前加上一條鎖的語句來實現,這就使得一段時間內只有一個任務可以執行這段程式碼。因為鎖語句產生了一種互斥的效果,所以這種機制也稱互斥量。

2.java提供關鍵字synchronized形式,為防止資源衝突提供了內建支援。當任務要執行synchronized關鍵字保護的程式碼,會檢查鎖是否可用,然後獲取鎖,執行程式碼,施放鎖。

3.共享資源一般是以物件形式存在記憶體片段中,但也可以是檔案、輸入輸出埠或印表機。要控制對共享資源的訪問,就先把它包裝進一個物件,然後把所有要訪問這個資源的方法標記為synchronized。如果某一個任務對標記為synchronized的方法呼叫,那麼這個執行緒從該方法返回之前,其他所有要呼叫這個同步方法都會被阻塞。

4.併發中,類的資料成員應該宣告private,並且只能通過方法訪問資料,可以把方法標記為synchronized防止資源衝突。如synchronized  void f();

5.所有的物件都自動含有單一鎖,當在物件上呼叫其任意synchronized方法,此物件都會被加鎖,這時候該物件上的其他synchronized方法 只有等到前一個方法呼叫完畢並釋放鎖喉才能呼叫。如果某個任務對物件呼叫了f方法,對於同一個物件而言,只能等到f方法被呼叫結束並釋放了鎖。對於某個特定的物件而言,其所有的synchronized方法共享同一個鎖,可以防止多個任務同時訪問被編碼為物件記憶體。

6.什麼時候用同步

如果你正在寫一個變數,它可能接下來被另一個執行緒讀取或正在讀取一個上一次已經被另外一個執行緒寫過的變數,必須使用同步,並且,讀和寫執行緒都必須使用相同的監視器同步

每個訪問臨界共享資源的方法都必須被同步,否則它們就不會正確的工作。

synchronized和顯示Lock物件:

1使用synchronized關鍵字,需要編寫的程式碼量少,並且使用者出錯的可能性會降低,因此通常只有在解決特殊問題,才顯示的使用Lock物件。

2使用synchronized關鍵字不能嘗試著獲取鎖且最終獲取鎖失敗,可是使用lock物件試試

3使用lock物件可以對同步做到更細粒度的控制