java ReentrantLock 使用
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 使用相关推荐
- java锁的概念,Java ReentrantLock锁机制概念篇
分享Java锁机制实现原理,细节涉及volatile修饰符.CAS原子操作.park阻塞线程与unpark唤醒.双向链表.锁的公平性与非公平性.独占锁和共享锁.线程等待await.线程中断interr ...
- 死磕Java——ReentrantLock
一.死磕Java--ReentrantLock ReentrantLock是java.util.concurrent.locks包下一个可重入的默认是非公平的锁,ReentrantLock类是Lock ...
- Java ReentrantLock 详解
ReentrantLock 和 synchronized 的区别: 1.ReentrantLock 不需要代码块,在开始的时候lock,在结束的时候unlock 就可以了. 但是要注意,lock 是有 ...
- java ReentrantLock 实现原理
使用 synchronized 来做同步处理时,锁的获取和释放都是隐式的,实现的原理是通过编译后加上不同的机器指令来实现. 而 ReentrantLock 就是一个普通的类,它是基于 AQS(Abst ...
- JAVA ReentrantLock 分析
并发编程中经常用到的莫非是这个ReentrantLock这个类,线程获取锁和释放锁.还有一个则是synchronized,常用来多线程控制获取锁机制. 先写一个简单的例子. 1 2 3 4 5 6 7 ...
- java ReentrantLock 锁相关笔记
为什么80%的码农都做不了架构师?>>> ReentrantLock重入锁简单理解就是对同一个线程而言,它可以重复的获取锁.例如这个线程可以连续获取两次锁,但是释放锁的次数也一 ...
- 【java】java ReentrantLock 源码详解
文章目录 1.概述 2.问题 3.ReentrantLock源码分析 3.1 类的继承关系 3.2 类的内部类 3.2.1 Sync类 3.2.2 NonfairSync类 3.2.3 FairSyn ...
- Java ReentrantLock可重入锁的源码深度解析
Java的ReentrantLock的源码实现,包括加锁.解锁的源码,以及公平性.重入性的实现! 文章目录 1 ReentrantLock的概述 1.1 ReentrantLock的API方法 1.2 ...
- Java ReentrantLock源码总结 ReentrantLock源码注释翻译和解析中英文对照版 AQS虚拟类的实现
文章目录 ReentrantLock类源码重点 具体实现 lock操作 acquire操作 tryAcquire操作 公平锁版本 非公平锁版本 lockInterruptibly操作 acquireI ...
最新文章
- 你有哪些 Deep learning(RNN、CNN)调参的经验?
- intel 核显linux驱动程序,10nm来也!Intel 11代核显Linux驱动功能冻结
- android studio开关按钮,Android studio实现滑动开关
- nginx与apache详细性能对比
- React Native ScrollableTabView的自定义tabBar
- 使用的postman心得
- Angular实现dialog对话框封装
- Qt工作笔记-QString中Split与section效率实践
- 禁用任何未使用的端口com_CentOS7 - 使用Fail2ban保护SSH
- php 脚本执行超时,PHP脚本运行超时管理机制
- python输出实时时间
- windows便签 の 字体设置
- 鸟哥私房菜重温笔记4
- win 7 与 virtualbox ubuntu 共享文件夹
- excel三种查重方法
- 计算机图形学空间曲线,课程追忆之《计算机图形学》【曲线曲面篇】
- 220817笔试(速腾聚创)
- 寻求工控、自动化合作者建立工控网站!(长期有效)
- python爬虫爬取歌曲_python爬虫实战:爬取全站小说排行榜
- [数据结构]图的思维导图