1、公平鎖 一、爲何有公平鎖 CPU在調度線程的時候是在等待隊列裏隨機挑選一個線程,因爲這種隨機性因此是沒法保證線程先到先得的(synchronized控制的鎖就是這種非公平鎖)。但這樣就會產生飢餓現象,即有些線程(優先級較低的線程)可能永遠也沒法獲取cpu的執行權,優先級高的線程會不斷的強制它的資源。那麼如何解決飢餓問題呢,這就須要公平鎖了。 產生飢餓的另外一個緣由是:某個線程佔據資源不釋放,那其餘須要該資源的線程只能處於無限等待中。在這裏咱們主要解決第一種飢餓問題。 二、什麼是公平鎖 公平鎖能夠保證線程按照時間的前後順序執行,避免飢餓現象的產生。但公平鎖的效率比較地,由於要實現順序執行,須要維護一個有序隊列。 2、公平鎖的使用 JDK1.5爲咱們提供了實習公平鎖的方式,建立公平鎖的構造函數是: java.util.concurrent.locks.ReentrantLock public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); } 經過判斷fair的值來決定重入鎖(ReentrantLock)是使用公平鎖 FairSync 仍是非公平鎖 NonfairSync 。 公平鎖Demo 複製代碼 package com.jalja.base.threadTest; import java.util.concurrent.locks.ReentrantLock; public class LockFairTest implements Runnable{ //建立公平鎖 private static ReentrantLock lock=new ReentrantLock(true); public void run() { while(true){ lock.lock(); try{ System.out.println(Thread.currentThread().getName()+"得到鎖"); }finally{ lock.unlock(); } } } public static void main(String[] args) { LockFairTest lft=new LockFairTest(); Thread th1=new Thread(lft); Thread th2=new Thread(lft); th1.start(); th2.start(); } } 複製代碼 執行結果: 複製代碼 Thread-1得到鎖 Thread-0得到鎖 Thread-1得到鎖 Thread-0得到鎖 Thread-1得到鎖 Thread-0得到鎖 Thread-1得到鎖 Thread-0得到鎖 Thread-1得到鎖 Thread-0得到鎖 Thread-1得到鎖 Thread-0得到鎖 Thread-1得到鎖 Thread-0得到鎖 Thread-1得到鎖 Thread-0得到鎖 複製代碼 這是截取的部分執行結果,分析結果可看出兩個線程是交替執行的,幾乎不會出現同一個線程連續執行屢次。 天天用心記錄一點點。內容也許不重要,但習慣很重要!