未加星标

Java线程 公平锁 ReentrantLock(boolean fair)

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二04 | 时间 20160901 | 作者 红领巾 ] 0人收藏点击收藏

一、公平锁

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获得锁

这是截取的部分执行结果,分析结果可看出两个线程是交替执行的,几乎不会出现同一个线程连续执行多次。

本文地址:http://www.linuxidc.com/Linux/2016-09/135414.htm


Java线程 公平锁 ReentrantLock(boolean fair)

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

主题: JavaCPULinux行权
分页:12
转载请注明
本文标题:Java线程 公平锁 ReentrantLock(boolean fair)
本站链接:http://www.codesec.net/view/483457.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(25)