java多線程——飢餓和公平


一、概念

飢餓:如果一個線程因為 CPU 時間全部被其他線程搶走而得不到 CPU 運行時間,這種狀態被稱之為“飢餓”;

 

二、飢餓原因

  1. 高優先級線程吞噬所有的低優先級線程的 CPU 時間。
  2. 線程被永久堵塞在一個等待進入同步塊的狀態,因為其他線程總是能在它之前持續地對該同步塊進行訪問。
  3. 線程在等待一個本身(在其上調用 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();
    }
}

2、公平鎖


四、java中的鎖

1、鎖的可重入性
如果一個線程已經擁有了一個管程對象上的鎖,那么它就有權訪問被這個管程對象同步的所有代碼塊。這就是可重入。

2、鎖的公平性
在finally中調用unlock()

3、讀寫鎖(
java.util.concurrent.locks.ReadWriteLock)

假設你的程序中涉及到對一些共享資源的讀和寫操作,且寫操作沒有讀操作那么頻繁。
在沒有寫操作的時候,兩個線程同時讀一個資源沒有任何問題,所以應該允許多個線程能在同時讀取共享資源。
但是如果有一個線程想去寫這些共享資源,就不應該再有其它線程對該資源進行讀或寫。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM