zoukankan      html  css  js  c++  java
  • 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获得锁

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

  • 相关阅读:
    soap-学习
    Redis教程
    Java 不可变对象
    java volatile
    Go语言
    mongodb 基础语法
    Linux 命令大全
    Java json字符串对比
    sqlserver 数据库阻塞和死锁
    http 和 https 的区别
  • 原文地址:https://www.cnblogs.com/jalja/p/5893788.html
Copyright © 2011-2022 走看看