1. 程式人生 > >JAVA多執行緒-Lock的使用(二)-公平鎖與非公平鎖

JAVA多執行緒-Lock的使用(二)-公平鎖與非公平鎖

公平鎖與非公平鎖

       鎖Lock分為:公平鎖和非公平鎖。

       公平鎖:表示執行緒獲取鎖的順序是按照執行緒加鎖的順序來分配的,即先來先得的FIFO先進先出順序。

       非公平鎖:一種獲取鎖的搶佔機制,是隨機獲得鎖的,和公平鎖不一樣的就是先來的不一定先得到鎖,這個方式可能造成某些執行緒一直拿不到鎖,結果就不公平了。

       1、公平鎖的案例

<span style="font-size:14px;">package org.jksoft.thread.reentrantLock;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 測試四:測試公平鎖與非公平鎖
 * 
 * @author mcl
 * 
 *         2016-2-21-上午11:11:46
 */
public class Test4 {
    /* 公平鎖案例:
    public static void main(String[] args) {
        MyService5 service = new MyService5(true);
        MyThread5[] threads = new MyThread5[10];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new MyThread5(service);
            threads[i].start();
        }
    }
*/
    // 非公平鎖案例:
    public static void main(String[] args) {
        MyService5 service = new MyService5(false);
        MyThread5[] threads = new MyThread5[10];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new MyThread5(service);
            threads[i].start();
        }
    }
}

class MyThread5 extends Thread {
    private MyService5 service;

    public MyThread5(MyService5 service) {
        this.service = service;
    }

    public void run() {
        System.out.println(Thread.currentThread().getName() + " :已經運行了....");
        service.test();
    }
}

class MyService5 {
    private Lock lock;

    public MyService5(boolean isFair) {
        lock = new ReentrantLock(isFair);
    }

    public void test() {
        lock.lock();
        System.out.println(Thread.currentThread().getName() + " :獲得了鎖");
        lock.unlock();
    }
}</span>
    結果:我們可以看到 執行緒執行順序與獲得鎖的順序是一致的,這就是安全鎖(FIFO)

 

   2、非安全鎖