课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > 昆明达内java培训:java线程公平锁
  • 昆明达内java培训:java线程公平锁

    发布:昆明Java培训      来源:达内新闻      时间:2016-09-22

  • 昆明Java培训机构的老师今天给大家讲java线程公平锁ReentrantLock(boolean fair)

    一、公平锁

    1、为什么有公平锁

    CPU在调度线程的时候是在等待队列里随机挑选一个线程,由于这种随机性所以是无法保证线程先到先得的(synchronized控制的锁就是这种非公平锁)。但这样就会产生饥饿现象,即有些线程(优先级较低的线程)可能永远也无法 取cpu的执行权,优先级高的线程会不断的强制它的资源。那么如何解决饥饿问题呢,这就需要公平锁了。

    产生饥饿的另一个原因是:某个线程占据资源不释放,那其他需要该资源的线程只能处于无限等待中。在这里昆明Java培训机构的老师主要解决第一种饥饿问题。

    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培训机构的老师截取的部分执行结果,分析结果可看出两个线程是交替执行的,几乎不会出现同一个线程连续执行多次。

    了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

    推荐文章

上一篇:java程序-剖析ArrayList

下一篇:怎么用httpClient实现微信公众号的消息群发

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56