JUC包实现的同步机制,原理以及简单用法总结
除了用Synchronized关键字修饰同步块,让线程获取某对象的锁实现多线程操作共享变量的同步外,还可以使用java.util.concurrent包。并且,juc包机制下的同步更灵活。juc包的所有锁都实现自Lock接口和ReadWriteLock接口,下面分别总结。

(图片来源于网络)
Lock接口
Lock在java.util.concurrent.locks包中,Lock是一个接口,我们一般使用的是它的实现类:ReentrantLock (可重入锁)。ReentrantLock类的主要方法有:
void lock() //获取调用此代码的对象的锁,失败就等待 boolean tryLock() //尝试获取调用此代码的对象的锁,失败返回false,不等待 boolean tryLock(long t) //尝试获取调用此代码的对象的锁,失败等待 t 时间后返回false void lockInterruptibly() // 获取调用此代码的对象的锁,失败就等待。但是这个等待可以中断 (与syn不同,syn只有wait、join、 sleep的线程可悲中断) void unlock() //释放锁(必须手动写明)
使用示例如下:
public class Main {
public static void main(String[] args) {
Test t = new Test();
t.readAndWriteSomething(); //main线程要对 t 进行一些需要同步的操作
}
}
class Test {
...
int value = 1;
Lock l = new ReentrantLock(); public void readAndWriteSomething() {
l.lock(); //获取 t 的锁
.....; //从 t 读出写入一些内容
l.unlock(); //释放 t 的锁
}
}
大概使用方法就是上面这样,至于其他的tryLock、lockInterruptibly等方法就看具体情况灵活应用了。但是手动释放锁的操作十分重要,不然其他线程可能会饥饿,甚至出现死锁现象。
ReadWriteLock接口
我们知道,多个线程读取并不会造成一些危险。所以我们想,可不可以有一种锁,在读操作的时候可以多个线程共享(即锁可以同时由几个线程共同持有),写操作时又变为互斥锁。ReadWriteLock接口的实现类ReentrantReadWriteLock可以实现这种操作。
ReentrantReadWriteLock中的两个方法:
Lock readLock() //返回一个读锁,时可以共享的
Lock writeLock() //返回一个写锁,不可以共享
使用示例:
public class Main {
public static void main(String[] args) {
Test t = new Test();
t.readAndWriteSomething(); //main线程要对 t 进行一些需要同步的操作
}
}
class Test {
...
int value = 1;
Lock l = new ReentrantReadWriteLock();
public void readAndWriteSomething() {
l.readLock().lock(); //获取 t 的读锁
.....; //从 t 读出一些内容
l.readLock().unlock(); //释放 t 的读锁
l.writeLock().lock() //获取 t 的写锁
...... //从 t 写入一些内容
l.writeLock().unlock(); //释放 t 的写锁
}
}
可以看到,并没有多复杂,无非把一个对象的锁拆成读锁、写锁两部分而已,其中读锁是共享锁,写锁互是斥锁。读操作时获取读锁,写操作时获取写锁。提高效率
总结二者区别
Synchronized是关键字,lock机制是一组类实现;
Synchronized没有共享锁,lock机制有读锁(共享的);
Synchronized没有lock灵活,lock可以随时获取对象的锁,但需要手动释放(这也是灵活的表现);
lock机制下有tryLock返回获取锁的结果,成功or失败;
lock机制下获取锁失败的线程可以被中断。
当然,lock机制下,每个有同步块的对象需要持有实现了Lock接口的类的实例,通过这个实例去修改对象的锁状态。
JUC包实现的同步机制,原理以及简单用法总结的更多相关文章
- Java CAS同步机制 原理详解(为什么并发环境下的COUNT自增操作不安全): Atomic原子类底层用的不是传统意义的锁机制,而是无锁化的CAS机制,通过CAS机制保证多线程修改一个数值的安全性。
精彩理解: https://www.jianshu.com/p/21be831e851e ; https://blog.csdn.net/heyutao007/article/details/19 ...
- JUC包Lock机制的支持--AQS
在上一次总结中,提到了JUC包下使用Lock接口实现同步的方法,以及和Synchronized关键字的一些比较,那么使用Lock完成锁机制的底层支持又是什么呢?总结如下: 1 AQS是什么 AQS是一 ...
- Chromium Graphics: GPUclient的原理和实现分析之间的同步机制-Part I
摘要:Chromium于GPU多个流程架构的同意GPUclient这将是这次访问的同时GPU维修,和GPUclient这之间可能存在数据依赖性.因此必须提供一个同步机制,以确保GPU订购业务.本文讨论 ...
- JUC包中的分而治之策略-为提高性能而生
一.前言 本次分享我们来共同探讨JUC包中一些有意思的类,包含AtomicLong & LongAdder,ThreadLocalRandom原理. 二.AtomicLong & Lo ...
- ffmpeg转码MPEG2-TS的音视频同步机制分析
http://blog.chinaunix.net/uid-26000296-id-3483782.html 一.FFmpeg忽略了adaptation_field()数据 FFmpeg忽略了包含PC ...
- Kafka设计解析(八)- Exactly Once语义与事务机制原理
原创文章,首发自作者个人博客,转载请务必将下面这段话置于文章开头处. 本文转发自技术世界,原文链接 http://www.jasongj.com/kafka/transaction/ 写在前面的话 本 ...
- [数据库锁机制] 深入理解乐观锁、悲观锁以及CAS乐观锁的实现机制原理分析
前言: 在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数据库都提供了锁机制,并引入了事务隔离级别的概念.数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务 ...
- 内核同步机制-RCU同步机制
转自:https://blog.csdn.net/nevil/article/details/7718375 转自http://www.360doc.com/content/09/0805/00/36 ...
- Java多线程的同步机制(synchronized)
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...
随机推荐
- HZOJ 单
两个子任务真的是坑……考试的时候想到了60分的算法,然而只拿到了20分(各种沙雕错,没救了……). 算法1: 对于测试点1,直接n遍dfs即可求出答案,复杂度O(n^2),然而还是有好多同学跑LCA/ ...
- spring+mybatis最简多数据源配置
作者:纯洁的微笑出处:http://www.ityouknow.com/ 版权所有,欢迎保留原文链接进行转载:) 说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持 ...
- TestNG中DataProvider的用法一
目录 为什么要使用DataProvider DataProvider的常规用法 带Method参数的DataProvider 带ITestContext的DataProvider DataProvid ...
- Samba:打造企业级授权文件共享服务器
写在前面的话 先来说说故事背景:公司内部文件服务器的解决方案其实很多,对于中小型互联网公司,大多的在这一块的选型还是 FTP,或者 VSFTP,但是个人实在是对那个东西喜欢不起来,于是就选择了配置相对 ...
- Linux学习笔记05之网络基础知识
一.OSI参考模型:适用于所有网络,现有模型,后有协议 1.应用层:应用程序.用户接口 2.表示层:编码转换.压缩.解压.加密等 3.会话层:建立.维护.拆除会话 4.传输层规定了应用程序的的接口 协 ...
- .NET Core 3.0深入源码理解HttpClientFactory之实战
写在前面 前面两篇文章透过源码角度,理解了HttpClientFactory的内部实现,当我们在项目中使用时,总会涉及以下几个问题: HttpClient超时处理以及重试机制 HttpClient ...
- tcp四次挥手为什么要等待2MSL
之前所说了解有两个原因: 1.防止客户端最后一次发给服务器的确认在网络中丢失以至于客户端关闭,而服务端并未关闭,导致资源的浪费. 2.等待最大的2msl可以让本次连接的所有的网络包在链路上消失,以防造 ...
- 1和new Number(1)有什么区别
1和new Number(1)有什么区别 author: @Tiffanysbear 总结,两者的区别就是原始类型和包装对象的区别. 什么是包装对象 对象Number.String.Boolean分别 ...
- linux安装启动mongodb
1:下载 http://www.mongodb.org/downloads 在85机器上上传压缩包后解压缩. 首先在linux中解压缩安装程序 通过命令操作: 解压 tar -zxvf mongodb ...
- iText实现pdf导出
/** * AsianTest.java */ import java.io.FileOutputStream; import java.io.IOException; import com.lowa ...