一、解析
为什么要非公平锁:
、避免唤醒的带来的空档期。
、空档期的效率。
代码演示:
public class FairLock {
public static void main(String[] args) {
PrintQueue printQueue = new PrintQueue();
Thread thread[] = new Thread[10];
for (int i = 0; i < 10; i++) {
thread[i] = new Thread(new Job(printQueue));
}
for (int i = 0; i < 10; i++) {
thread[i].start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Job implements Runnable {
PrintQueue printQueue;
public Job(PrintQueue printQueue) {
this.printQueue = printQueue;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 开始打印");
printQueue.printJob(new Object());
System.out.println(Thread.currentThread().getName() + " 开始结束");
}
}
class PrintQueue{
private Lock queueLock = new ReentrantLock(false); //设置公平 true / 非公平 false
public void printJob(Object document) {
queueLock.lock();
try {
int duration = new Random().nextInt(10) + 1;
System.out.println(Thread.currentThread().getName() + "正在打印,需要 " + duration);
Thread.sleep(duration * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
queueLock.unlock();
}
queueLock.lock();
try {
int duration = new Random().nextInt(10) + 1;
System.out.println(Thread.currentThread().getName() + "正在打印,需要 " + duration);
Thread.sleep(duration * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
queueLock.unlock();
}
}
}
打印结果(公平):
Thread-0 开始打印 Thread-0正在打印,需要 7 Thread-1 开始打印 Thread-2 开始打印 Thread-3 开始打印 Thread-4 开始打印 Thread-5 开始打印 Thread-6 开始打印 Thread-7 开始打印 Thread-8 开始打印 Thread-9 开始打印 Thread-1正在打印,需要 5 Thread-2正在打印,需要 10 Thread-3正在打印,需要 5 Thread-4正在打印,需要 4 Thread-5正在打印,需要 7 Thread-6正在打印,需要 2 Thread-7正在打印,需要 1 Thread-8正在打印,需要 9 Thread-9正在打印,需要 10 Thread-0正在打印,需要 8 Thread-0 开始结束 Thread-1正在打印,需要 1 Thread-1 开始结束 Thread-2正在打印,需要 5 Thread-2 开始结束 Thread-3正在打印,需要 2 Thread-3 开始结束 Thread-4正在打印,需要 9 Thread-4 开始结束 Thread-5正在打印,需要 1 Thread-5 开始结束 Thread-6正在打印,需要 7 Thread-6 开始结束 Thread-7正在打印,需要 10 Thread-7 开始结束 Thread-8正在打印,需要 7 Thread-8 开始结束 Thread-9正在打印,需要 1 Thread-9 开始结束 Disconnected from the target VM, address: '127.0.0.1:50215', transport: 'socket'
打印结果(非公平):
Thread-0 开始打印 Thread-0正在打印,需要 7 Thread-1 开始打印 Thread-2 开始打印 Thread-3 开始打印 Thread-4 开始打印 Thread-5 开始打印 Thread-6 开始打印 Thread-7 开始打印 Thread-8 开始打印 Thread-9 开始打印 Thread-0正在打印,需要 4 Thread-0 开始结束 Thread-1正在打印,需要 6 Thread-1正在打印,需要 8 Thread-1 开始结束 Thread-2正在打印,需要 6 Thread-2正在打印,需要 3 Thread-2 开始结束 Thread-3正在打印,需要 4 Thread-3正在打印,需要 8 Thread-3 开始结束 Thread-4正在打印,需要 8 Thread-4正在打印,需要 4 Thread-4 开始结束 Thread-5正在打印,需要 8 Thread-5正在打印,需要 1 Thread-5 开始结束 Thread-6正在打印,需要 10 Thread-6正在打印,需要 2 Thread-6 开始结束 Thread-7正在打印,需要 8 Thread-7正在打印,需要 9 Thread-7 开始结束 Thread-8正在打印,需要 6 Thread-8正在打印,需要 9 Thread-8 开始结束 Thread-9正在打印,需要 1 Thread-9正在打印,需要 6 Thread-9 开始结束 Process finished with exit code 0
源码展示:



