JUC——线程同步锁(ReentrantLock)
ReentrantLock简介
ReentrantLock是一个可重复的互斥锁,又被称为独占锁,可重入的意思是:ReentrantLock锁可以被单个线程多次获取。但是在同一个时间点只能被一个线程锁持有
ReentrantLock使用一个FIFO(先进先出)的等待队里来管理获取该锁所有线程的。
ReentrantLock是一个独占锁,在获取锁的之后其所有的操作都是线程独享的,其他的线程在没有获取到锁之前都需要等待。
public class ReentrantLock implements Lock,java.io.Serializable
ReentrantLock之中分为公平锁与非公平锁,它们的区别体现在获取锁的机制上是否公平以及执行速度上。、
这两种锁的启用也是非常容易控制的,这个类提供的构造方法如下:
- 无参构造(非公平锁,NonfairSync)
public ReentrantLock() {
sync = new NonfairSync();
} - 有参构造
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
//fair = true,表示公平锁,FairSync
//fair = false,表示非公平锁,NonfairSync
ReentrantLock继承结构

范例:使用ReentrantLock定义一个多线程卖票的处理程序
package so.strong.mall.concurrent;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; class Ticket {
private Lock myLock = new ReentrantLock(); //非公平锁
private int count = 10; //一共10张票
public void sale() {
myLock.lock(); //进入到阻塞状态,一直到unlock执行后解除阻塞
try {
if (this.count > 0) {
System.out.println(Thread.currentThread().getName() + "卖票,ticket=" + this.count--);
}
} finally {
myLock.unlock(); //不管最终结果如何一定要进行解锁
}
}
} public class TestDemo {
public static void main(String[] args) {
final Ticket ticket = new Ticket(); //多线程要共享同一个数据资源
for (int i = 0; i < 6; i++) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
ticket.sale(); //卖票处理
}
}
}).start();
}
}
}
Thread-0卖票,ticket=10
Thread-0卖票,ticket=9
Thread-0卖票,ticket=8
Thread-0卖票,ticket=7
Thread-0卖票,ticket=6
Thread-0卖票,ticket=5
Thread-0卖票,ticket=4
Thread-2卖票,ticket=3
Thread-2卖票,ticket=2
Thread-2卖票,ticket=1
当前的代码要比直接使用synchronized更加容易,而且锁的处理机制更加的直观。通过查看源代码可以发现,使用lock()进行锁定的时候会考虑两种情况:
Sync-java.util.concurrent.locks.ReentrantLock
- FairSync-java.util.concurrent.locks.ReentrantLock
- NonFairSync-java.util.concurrent.locks.ReentrantLock
在进行公平锁处理的时候每当锁定一个线程对象就会使用“acquire(1)”方法进行表示:
final void lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
在进行解锁时会使用一个"sync.release(1)”释放方法, 1 表示释放一个:
public void unlock() {
sync.release(1);
}
JUC——线程同步锁(ReentrantLock)的更多相关文章
- JUC——线程同步锁(Condition精准控制)
在进行锁处理的时候还有一个接口:Condition,这个接口可以由用户来自己进行锁的对象创建. Condition的作用是对锁进行更精确的控制. Condition的await()方法相当于Objec ...
- JUC——线程同步锁(锁处理机制简介)
锁处理机制简介 juc的开发框架解决的核心问题是并发访问和数据安全操作问题,当进行并发访问的时候如果对于锁的控制不当,就会造成死锁这样的阻塞问题. 为了解决这样的缺陷,juc里面重新针对于锁的概念进行 ...
- JUC——线程同步锁(ReentrantReadWriteLock读写锁)
读写锁简介 所谓的读写锁值得是两把锁,在进行数据写入的时候有一个把“写锁”,而在进行数据读取的时候有一把“读锁”. 写锁会实现线程安全同步处理操作,而读锁可以被多个对象读取获取. 读写锁:ReadWr ...
- JUC——线程同步锁(LockSupport阻塞原语)
java.util.concurrent.locks.LockSupport这个是一个独立的类,这个类的主要功能是用来解决Thread里面提供的suspend()(挂起线程).resume()(恢复运 ...
- Python之路(第四十四篇)线程同步锁、死锁、递归锁、信号量
在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lock ...
- 同步锁——ReentrantLock
本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 Lock接口简介 在JUC包下面有一个java.util ...
- Java 基础【07】线程同步锁的选择
在需要线程同步的时候如何选择合适的线程锁? 例:选择可以存入到常量池当中的对象,String对象等 public class SyncTest { private String name = &quo ...
- 多线程 - 线程同步锁(lock、Monitor)
1. 前言 多线程编程的时候,我们不光希望两个线程间能够实现逻辑上的先后顺序运行,还希望两个不相关的线程在访问同一个资源的时候,同时只能有一个线程对资源进行操作,否则就会出现无法预知的结果. 比如,有 ...
- java基础---Java---面试题---银行业务调度系统(线程同步锁、枚举、线程池)
银行业务调度系统的项目需求: 模拟实现银行业务调度系统逻辑,具体需求如下: Ø 银行内有6个业务窗口,1- 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口. Ø 有三种对应类 ...
随机推荐
- 我在德国做SAP CRM One Order redesign工作的心得
时间过得很快,今天是我到德国工作的第四周,刚好一个月.Prototype的框架已经搭起来了,现在Order能够在新的框架下正常读写,能跑一些简单的scenario,这些scenario对于end us ...
- Java & Groovy & Scala & Kotlin - 20.Switch 与模式匹配
Overview 本章主要介绍高级条件语句中的 switch 语句以及其增强版的模式匹配. Java 篇 Switch 特点 Java 中 switch 语句功能类似 if,但是 switch 主要用 ...
- Day9 抽象类和接口
抽象类 抽象类定义 只约定类所具有的抽象行为,没有具体实现相应行为. 语法格式 abstract class 类名{ 常量; 变量; 构造(); 访问修饰符abstract 返回类型 方法名;//抽象 ...
- ethers.js-5-Utilities
https://docs.ethers.io/ethers.js/html/api-utils.html 使用时再进行查看即可
- 优化方法:SGD,Momentum,AdaGrad,RMSProp,Adam
参考: https://blog.csdn.net/u010089444/article/details/76725843 1. SGD Batch Gradient Descent 在每一轮的训练过 ...
- maven +IEDA+log4j
一.pom.xml加入log4j的依赖包 <!-- 日志文件管理包 --><dependency> <groupId>log4j</groupId> ...
- Javascript中的继承与Prototype
之前学习js仅仅是把w3school上的基本语法看了一次而已,再后来细看书的时候,书中会出现很多很多没有听过的语法,其中一个就是js的继承以及总能看到的prototype.我主要在看的两本js书是&l ...
- GoodUserInterface 模仿页面功能
模仿一些好的应用中的好的界面或功能.平时使用的APP有很多,其中一些都是常见的功能的拼凑,在业务层面比较复杂,而具体的页面实现都很类似.在这种情况下,我们还会发现有一些APP的页面效果的实现方式比较独 ...
- Hbase的安装和基本使用
Hbase介绍 HBase是一个开源的非关系型分布式数据库(NoSQL),它参考了谷歌的BigTable建模,实现的编程语言为 Java.它是Apache软件基金会的Hadoop项目的一部分,运行于H ...
- git更新远程仓库报错
hint: Updates were rejected because the tip of your current branch is behind hint: its remote counte ...