公平锁与非公平锁
锁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、非安全锁