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得到锁 复制代码 这是截取的部分执行结果,分析结果可看出两个线程是交替执行的,几乎不会出现同一个线程连续执行屡次。 天天用心记录一点点。内容也许不重要,但习惯很重要!