1.ReentrantLock  简单的使用

private Lock lock = new ReentrantLock();
lock.lock();用来获取锁。
lock.unlock();用来释放锁

package com.qey.lock;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** @ClassName UseReentrantLock* @Description volte* @Author * @Date 2020-05-13 15:03* @Version 1.1**/
public class UseReentrantLock {private Lock lock = new ReentrantLock();public void  method1(){try {lock.lock();System.out.println("当前线程 method1"+Thread.currentThread().getName()+"进入");Thread.sleep(1000);System.out.println("当前线程 method1"+Thread.currentThread().getName()+"退出");Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}finally {lock.unlock();}}public void method2(){try {lock.lock();System.out.println("当前线程 method2"+Thread.currentThread().getName()+"进入");Thread.sleep(1000);System.out.println("当前线程 method2"+Thread.currentThread().getName()+"退出");Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}finally {lock.unlock();}}static class  RunnableDemo1 implements  Runnable{private  UseReentrantLock  useReentrantLock;public RunnableDemo1(UseReentrantLock useReentrantLock) {this.useReentrantLock = useReentrantLock;}@Overridepublic  void run() {useReentrantLock.method1();}}static class  RunnableDemo2 implements  Runnable{private  UseReentrantLock useReentrantLock;public RunnableDemo2(UseReentrantLock useReentrantLock) {this.useReentrantLock = useReentrantLock;}@Overridepublic void run() {useReentrantLock.method2();}}public static void main(String[] args) {//这里是测试,尽量使用ThreadPoolExecutor 创建线程,方式资源泄漏UseReentrantLock useReentrantLock = new UseReentrantLock();ExecutorService executorService = Executors.newFixedThreadPool(3);executorService.execute(new RunnableDemo1(useReentrantLock));executorService.execute(new RunnableDemo2(useReentrantLock));}
}

2.使用 ReentrantLock 实现生产者和消费者

package com.qey.lock;import javax.sound.midi.Soundbank;
import java.util.ArrayList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** @ClassName ConditionBuffer* @Description volte* @Author* @Date 2020-05-13 15:44* @Version 1.1**/
public class ConditionBuffer implements Buffer {private Lock lock = new ReentrantLock();private Condition put = lock.newCondition();private Condition take = lock.newCondition();private final static int CAPACITY = 1;private ArrayList<Integer> arrayList = new ArrayList<>(CAPACITY);private int count = -1;public ArrayList<Integer> getArrayList() {return arrayList;}@Overridepublic void put(Integer integer) throws InterruptedException {if (integer == null) {return;}lock.lock();try {while (count == CAPACITY) {put.await();System.out.println("ReentantLock put "+ Thread.currentThread().getName());}arrayList.add(integer);count++;take.signal();} catch (InterruptedException e) {e.printStackTrace();}finally {lock.unlock();}}@Overridepublic Integer take() throws InterruptedException {lock.lock();while (count == 0) {take.await();System.out.println("ReentantLock take "+ Thread.currentThread().getName());}try {Integer o = arrayList.get(count % CAPACITY);count--;put.signal();return o;} finally {lock.unlock();}}static  class  RunnableTake implements  Runnable{private  Buffer buffer;public RunnableTake(Buffer buffer) {this.buffer = buffer;}@Overridepublic void run() {try {while (true){buffer.take();}} catch (InterruptedException e) {e.printStackTrace();}}}static  class  RunnablePut implements  Runnable{private  Buffer buffer;public RunnablePut(Buffer buffer) {this.buffer = buffer;}@Overridepublic void run() {try {while (true){buffer.put(1);}} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {ConditionBuffer conditionBuffer = new ConditionBuffer();Thread thread1 = new Thread(new RunnablePut(conditionBuffer));thread1.start();Thread thread2 = new Thread(new RunnableTake(conditionBuffer));thread2.start();}
}

后续补充:ReentrantReadWriteLock  多线程并发之读写锁(ReentranReadWriteLock&ReadWriteLock)使用详解_小小默:进无止境-CSDN博客

参考:Java ReentrantLock中condition通信的好处 - 简书

JAVA中的ReentrantLock和ReentrantReadWriteLock锁简单使用_madman-CSDN博客_reentrantreadwritelock使用

java ReentrantLock 使用相关推荐

  1. java锁的概念,Java ReentrantLock锁机制概念篇

    分享Java锁机制实现原理,细节涉及volatile修饰符.CAS原子操作.park阻塞线程与unpark唤醒.双向链表.锁的公平性与非公平性.独占锁和共享锁.线程等待await.线程中断interr ...

  2. 死磕Java——ReentrantLock

    一.死磕Java--ReentrantLock ReentrantLock是java.util.concurrent.locks包下一个可重入的默认是非公平的锁,ReentrantLock类是Lock ...

  3. Java ReentrantLock 详解

    ReentrantLock 和 synchronized 的区别: 1.ReentrantLock 不需要代码块,在开始的时候lock,在结束的时候unlock 就可以了. 但是要注意,lock 是有 ...

  4. java ReentrantLock 实现原理

    使用 synchronized 来做同步处理时,锁的获取和释放都是隐式的,实现的原理是通过编译后加上不同的机器指令来实现. 而 ReentrantLock 就是一个普通的类,它是基于 AQS(Abst ...

  5. JAVA ReentrantLock 分析

    并发编程中经常用到的莫非是这个ReentrantLock这个类,线程获取锁和释放锁.还有一个则是synchronized,常用来多线程控制获取锁机制. 先写一个简单的例子. 1 2 3 4 5 6 7 ...

  6. java ReentrantLock 锁相关笔记

    为什么80%的码农都做不了架构师?>>>    ReentrantLock重入锁简单理解就是对同一个线程而言,它可以重复的获取锁.例如这个线程可以连续获取两次锁,但是释放锁的次数也一 ...

  7. 【java】java ReentrantLock 源码详解

    文章目录 1.概述 2.问题 3.ReentrantLock源码分析 3.1 类的继承关系 3.2 类的内部类 3.2.1 Sync类 3.2.2 NonfairSync类 3.2.3 FairSyn ...

  8. Java ReentrantLock可重入锁的源码深度解析

    Java的ReentrantLock的源码实现,包括加锁.解锁的源码,以及公平性.重入性的实现! 文章目录 1 ReentrantLock的概述 1.1 ReentrantLock的API方法 1.2 ...

  9. Java ReentrantLock源码总结 ReentrantLock源码注释翻译和解析中英文对照版 AQS虚拟类的实现

    文章目录 ReentrantLock类源码重点 具体实现 lock操作 acquire操作 tryAcquire操作 公平锁版本 非公平锁版本 lockInterruptibly操作 acquireI ...

最新文章

  1. 你有哪些 Deep learning(RNN、CNN)调参的经验?
  2. intel 核显linux驱动程序,10nm来也!Intel 11代核显Linux驱动功能冻结
  3. android studio开关按钮,Android studio实现滑动开关
  4. nginx与apache详细性能对比
  5. React Native ScrollableTabView的自定义tabBar
  6. 使用的postman心得
  7. Angular实现dialog对话框封装
  8. Qt工作笔记-QString中Split与section效率实践
  9. 禁用任何未使用的端口com_CentOS7 - 使用Fail2ban保护SSH
  10. php 脚本执行超时,PHP脚本运行超时管理机制
  11. python输出实时时间
  12. windows便签 の 字体设置
  13. 鸟哥私房菜重温笔记4
  14. win 7 与 virtualbox ubuntu 共享文件夹
  15. excel三种查重方法
  16. 计算机图形学空间曲线,课程追忆之《计算机图形学》【曲线曲面篇】
  17. 220817笔试(速腾聚创)
  18. 寻求工控、自动化合作者建立工控网站!(长期有效)
  19. python爬虫爬取歌曲_python爬虫实战:爬取全站小说排行榜
  20. [数据结构]图的思维导图

热门文章

  1. html:(23):css代码语法和css注释语法
  2. linux mysql数据库备份并删除前一分钟的数据
  3. 搭建VS2008+OpenCV2.1开发环境
  4. 第二次实验报告(漏)
  5. 3.6-3.8 分布式环境启动、测试
  6. 微信小程序开发简易教程一
  7. OpenCV人脸检测并把图片写成avi视频
  8. HDOJ 2037 今年暑假不AC 【贪心】
  9. 关于 springcloud gateway 设置 context-path 的问题
  10. jmeter中文版新手入门教程