zoukankan      html  css  js  c++  java
  • ReentrantLock锁 IT

    ReentrantLock是可重入锁,并且可以实现公平锁。Sychronized是可重入锁、非公平锁。

    话不多说,上demo:

     1 package com.example.demo.util;
     2 
     3 import java.util.concurrent.locks.ReentrantLock;
     4 
     5 public class ReetrantLockFairTest {
     6 
     7     // 参数为true,则为公平锁,即线程按等待时间顺序,最久的先获得锁
     8     // 参数为false或为空则为非公平锁,线程自由竞争锁
     9     static ReentrantLock lock = new ReentrantLock(true);
    10 
    11     public static void main(String[] args) {
    12 
    13         for (int i = 0; i < 8; i++) {
    14             new Thread(() -> test(), "线程" + i).start();
    15         }
    16     }
    17 
    18     public static void test() {
    19 
    20         for (int i = 0; i < 2; i++) {// 使用循环2轮并且加sleep时间,来模拟测试线程执行顺序
    21             lock.lock();
    22             try {
    23                 System.out.println(Thread.currentThread().getName() + ":获得了锁。");
    24                 Thread.sleep(500l);// 模拟时间需确保第一个线程获得锁后,其他所有线程都已经启动并等待锁。然后进入for循环等待第二轮
    25             } catch (Exception e) {
    26                 e.printStackTrace();
    27             } finally {
    28                 lock.unlock();
    29             }
    30         }
    31     }
    32 }

    执行结果:可以看到,第二轮获得锁的线程顺序与第一轮 一样。这样就实现了公平锁。

    线程0:获得了锁。
    线程2:获得了锁。
    线程1:获得了锁。
    线程3:获得了锁。
    线程4:获得了锁。
    线程5:获得了锁。
    线程6:获得了锁。
    线程7:获得了锁。
    线程0:获得了锁。 线程2:获得了锁。 线程1:获得了锁。 线程3:获得了锁。 线程4:获得了锁。 线程5:获得了锁。 线程6:获得了锁。 线程7:获得了锁。
  • 相关阅读:
    会员管理软件
    正则表达式查找未记录的异常
    网络通信 数据压缩后发送
    SQL 工具系列一
    P5443 [APIO2019]桥梁 [分块+并查集]
    #6499. 「雅礼集训 2018 Day2」颜色 [分块,倍增,bitset]
    CF594D REQ [离线+树状数组,欧拉函数]
    雅礼集训板刷合集
    [HNOI2016]网络 [树链剖分,可删除堆]
    「BZOJ3065」带插入区间K小值 [分块]
  • 原文地址:https://www.cnblogs.com/itfeng813/p/14645116.html
Copyright © 2011-2022 走看看