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里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...
随机推荐
- helm安装MINIO文件服务器
MinIO Quickstart Guide MinIO 是一个基于Apache License v2.0开源协议的对象存储服务.它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例 ...
- spark 源码分析之十一--Spark RPC剖析之TransportClient、TransportServer剖析
TransportClient类说明 先来看,官方文档给出的说明: Client for fetching consecutive chunks of a pre-negotiated stream. ...
- Netty 客户端使用指数退避机制实现重连
指数退避 可以理解为每次重连失败时,就把重连时间设置为之前的指数级别.例如 2 秒,4 秒,8 秒...... 亚马逊AWS关于指数退避的两篇文章介绍 AWS 中的错误重试和指数退避 Exponent ...
- 主机cpu突然飙高,如何快速排查问题
[问题发现] 使用zabbix软件监控服务器时发现cpu突然异常,在业务主机上使用top命令查看系统的整体运行情况,使用top命令后发现mysqld占用CPU特别高,初步判断可能是mysqld出现问题 ...
- python多进程详解
目录 python多进程 序.multiprocessing 一.Process process介绍 例1.1:创建函数并将其作为单个进程 例1.2:创建函数并将其作为多个进程 例1.3:将进程定义为 ...
- RFC 2544 性能测试
什么是RFC 2544?网络设备性能测试的一组指标,包括吞吐率.时延.丢包率.背靠背. * * * 吞吐率(Throughput). 定义:被测设备在不丢包的情况下,所能转发的最大数据流量.通常使用每 ...
- html+css+dom补充
补充1:页面布局 一般像京东主页左侧右侧都留有空白,用margin:0 auto居中,一般.w. <!DOCTYPE html> <html lang="en"& ...
- GStreamer流媒体知识介绍
GStreamer框架 1.GStreamer是什么? 众所周知,Microsoft's Windows和Apple's MacOS对多媒体设备.多媒体创作.播放和实时处理等方面都有很好的支持,而Li ...
- DesignPattern系列__06迪米特原则
迪米特原则定义 迪米特原则,也叫最少知道原则,即一个类应该对自己依赖的类知道的越少越好,而你被依赖的类多么复杂,对我都没有关系.也就是说,对于别依赖的类来说,不管业务逻辑多么复杂,都应该尽量封装在类的 ...
- Codeforces Round #527 (Div. 3) 总结 A B C D1 D2 F
传送门 A 贪心的取 每个字母n/k次 令r=n%k 让前r个字母各取一次 #include <bits/stdc++.h> using namespace std; typedef lo ...