java线程 公平锁 ReentrantLock(boolean fair)
2016-09-21 21:57
513 查看
一、公平锁
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获得锁
这是截取的部分执行结果,分析结果可看出两个线程是交替执行的,几乎不会出现同一个线程连续执行多次。
相关文章推荐
- java线程 公平锁 ReentrantLock(boolean fair)
- Java线程之锁对象高效同步(ReentrantLock/ReentrantReadWriteLock)
- Java之ReentrantLock公平锁和非公平锁
- java多线程:并发包中ReentrantLock锁的公平锁原理
- Java中使用ReentrantLock控制线程执行顺序
- java中使用ReentrantLock锁中的Condition实现三个线程之间通信,交替输出信息
- java线程同步:synchronized关键字,Lock接口以及可重入锁ReentrantLock
- Java中ReentrantLock的公平锁和非公平锁
- java之ReentrantLock公平锁和非公平锁
- java并发线程---对锁ReentrantLock的理解
- 【Java基础之线程同步(二)】java线程同步:synchronized关键字,Lock接口以及可重入锁ReentrantLock
- Java线程(八):锁对象Lock-同步问题更完美的处理方式
- Java线程(七):锁对象Lock-同步问题更完美的处理方式 .
- 【java】同步,线程通信,lock
- Java中的ReentrantLock和synchronized两种锁定机制的对比
- ReentrantLock Fair 与 Unfair 的巨大差异
- 【转】java线程阻塞中断和LockSupport的常见问题
- java多线程随手记——ReentrantLock的公平锁与非公平锁
- Java线程(七):锁对象Lock-同步问题更完美的处理方式
- 线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯