多线程---lock锁(显示锁)

lock锁

 

 

重入锁(ReenturantLock)

重入锁(ReenturantLock)是Lock接口最常见的一种实现,顾名思义,它与synchronized一样是可重入的,在基本用法上,ReentrantLock也与synchronized很相似,只是代码实现方法上有些区别而且,另外一个很直接的区别是synchronized为Java中的一个关键字而ReentrantLock是一个接口。

此外,ReentrantLock与synchronized相比增加了一些高级功能,主要有以下三项:等待可中断,可实现公平锁及锁可以绑定多个条件。

等待可中断:是指当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情。可中断特性对处理执行时间非常长的同步块很有帮助。

公平锁:是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁;而非公平锁则不保证这一点,在锁被释放时,任何一个等待锁的线程都有机会获得锁。synchronized中的锁时非公平的,ReentrantLock在默认情况下也是非公平的,但可以通过带布尔值的构造函数要求使用公平锁不过一旦使用了公平锁,将会导致ReentrantLock的性能急剧下降,会明显影响吞吐量。 ———————————————— 对于重入锁的更加详细介绍,原文链接:https://blog.csdn.net/calm_encode/article/details/108672158

 

package com.mokuiran.thread;

//测试lock锁

import java.util.concurrent.locks.ReentrantLock;

public class TestLock {
   public static void main(String[] args) {
       TestLock2 testLock1 = new TestLock2();
     
       new Thread(testLock1,"a").start();
       new Thread(testLock1,"b").start();
       new Thread(testLock1,"c").start();
  }
}

class TestLock2 implements Runnable{

   int ticketNum = 10;

   //定义lock锁
  private final ReentrantLock lock =  new ReentrantLock();

   @Override
   public void run() {

       try{
           lock.lock();
           while (true){
               if (ticketNum>0){
                   try {
                       Thread.sleep(1000);
                  } catch (InterruptedException e) {
                       e.printStackTrace();
                  }
                   System.out.println(ticketNum--);
              }else{
                   break;
              }
          }
      }finally {
           lock.unlock();
      }

  }
}
 
posted @   默夔然  阅读(131)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示