一、概念
飢餓:如果一個線程因為 CPU 時間全部被其他線程搶走而得不到 CPU 運行時間,這種狀態被稱之為“飢餓”;
二、飢餓原因
- 高優先級線程吞噬所有的低優先級線程的 CPU 時間。
- 線程被永久堵塞在一個等待進入同步塊的狀態,因為其他線程總是能在它之前持續地對該同步塊進行訪問。
- 線程在等待一個本身(在其上調用 wait())也處於永久等待完成的對象,因為其他線程總是被持續地獲得喚醒。
三、公平性
1、用鎖代替同步代碼塊
public class Synchronizer{ Lock lock = new Lock(); public void doSynchronized() throws InterruptedException{ this.lock.lock(); //critical section, do a lot of work which takes a long time this.lock.unlock(); } }
java.util.concurrent.locks.ReadWriteLock
2、公平鎖
四、java中的鎖
1、鎖的可重入性
如果一個線程已經擁有了一個管程對象上的鎖,那么它就有權訪問被這個管程對象同步的所有代碼塊。這就是可重入。
2、鎖的公平性
在finally中調用unlock()
3、讀寫鎖()
假設你的程序中涉及到對一些共享資源的讀和寫操作,且寫操作沒有讀操作那么頻繁。
在沒有寫操作的時候,兩個線程同時讀一個資源沒有任何問題,所以應該允許多個線程能在同時讀取共享資源。
但是如果有一個線程想去寫這些共享資源,就不應該再有其它線程對該資源進行讀或寫。