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窗口. Ø 有三种对应类 ...
随机推荐
- QT导入libcurl支持HTTPS
对于我这种不会编译的人来说,必须找到已经编译好的DLL文件,以及头文件才能使用. 幸运的在这个网站https://stackoverflow.com/questions/28137379/libcur ...
- 解决hibernate双向关系造成的一方重复执行SQl,或者死循环的问题
系统采用struts-json hibernate3. 在对关联表配置manytoone onetomany双向关联的时候,在执行一方的时候,会发现打印出来的SQL语句多执行了一次或者多次.经过调试, ...
- BZOJ 1066 蜥蜴 最大流
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1066 题目大意: 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥 ...
- 情绪ABC理论
美国著名心理学家阿尔伯特·艾利斯 [Albert Ellis 1913.09.27]于20世纪50年代创立, 其理论认为引起人们情绪困扰的并不是外界发生的事件,而是人们对事件的态度.看法.评价等认知内 ...
- PHP eval() 函数
定义和用法 eval() 函数把字符串按照 PHP 代码来计算. 该字符串必须是合法的 PHP 代码,且必须以分号结尾. 如果没有在代码字符串中调用 return 语句,则返回 NULL.如果代码中存 ...
- 20165318 2017-2018-2 《Java程序设计》第八周学习总结
20165318 2017-2018-2 <Java程序设计>第八周学习总结 目录 学习过程遇到的问题及总结 教材学习内容总结 第12章 Java多线程机制 代码托管 代码统计 学习过程遇 ...
- [HNOI2003]操作系统
嘟嘟嘟 这道题就是一个模拟. 首先我们建一个优先队列,存所有等待的进程,当然第一关键字是优先级从大到小,第二关键字是到达时间从小到大.然后再建一个指针Tim,代表cpu运行的绝对时间. 然后分一下几种 ...
- Python自动化之django orm之Q对象
Python自动化之django orm之Q对象 什么是Q对象? Encapsulates filters as objects that can then be combined logically ...
- SpringCloud 学习(一) :Features
话不多说,现在在开发微服务项目,也想系统的学习一下SpringCloud,顾选择硬着头皮跟着英文官方文档学习一遍SpringCloud. 现在公司在用SpringCloud,也有很好的实践应用,加上更 ...
- 01.创建winserver2012r2+hyper-v+centos7
1.背景 DELL poweredge T320,装的winserver2012 r2,利用自带的hyper-v安装centos7,后期主要用于spark开发. 1.1 安装winserver2012 ...