java线程 公平锁 ReentrantLock(boolean fair)详解编程语言

一、公平锁

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

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

 

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/16324.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论