JAVA多執行緒-Lock的使用(二)-公平鎖與非公平鎖
阿新 • • 發佈:2019-02-19
公平鎖與非公平鎖
鎖Lock分為:公平鎖和非公平鎖。
公平鎖:表示執行緒獲取鎖的順序是按照執行緒加鎖的順序來分配的,即先來先得的FIFO先進先出順序。
非公平鎖:一種獲取鎖的搶佔機制,是隨機獲得鎖的,和公平鎖不一樣的就是先來的不一定先得到鎖,這個方式可能造成某些執行緒一直拿不到鎖,結果就不公平了。
1、公平鎖的案例:
結果:我們可以看到 執行緒執行順序與獲得鎖的順序是一致的,這就是安全鎖(FIFO)<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>
2、非安全鎖