Lock详解
在JDK1.5后,并发包里新增了Lock接口以及其实现类来实现锁功能,它提供了与synchronized关键字类似的锁功能,但它需要手动开启、关闭锁。虽然看起来没有synchronized方便,但它可以支持锁的可操作性,可中断获取,超时获取等多种非常使用的同步机制,下面主要围绕重入锁、读写锁展开
1、Lock接口的api
1、void lock()获取锁,调用该方法当前线程获取锁,获取锁之后返回
2、void lockInterruptibly() throws interruptedException可中断获取锁,与lock方法不同在于该方法可影响中断,既在锁的获取过程中可中断当前线程
3、boolean tryLock()尝试非阻塞获取锁,调用方法立即返回,返回true为成功
4、boolean tryLock(long time,TimeUnit unit) throws interruptedException 超时获取锁,一下情况会返回:时间内获取到了锁、时间内被中断、时间到了没有获取锁
5、void unLock()释放锁
2、ReentrantLock重入锁(排它锁)
它支持重进入的锁,即该锁支持同一个线程对共享资源重复进入加锁,还支持获取锁的公平、非公平的选择(在绝对时间上,先对锁进行索取的请求一定先被满足,那么这个锁就是公平的,反之就是不公平的。非公平锁效率高于公平锁,ReentrantLock默认是非公平锁)
应用场景如下:
1、如果发现该操作已经在执行中则不再执行(有状态执行)
如定时任务发现前一个尚未执行完,则本次直接返回不再执行
private ReentrantLock lock=new ReentrantLock();
if(lock.tryLock()){//如果已经被占用则直接返回false不会等待,达到忽略操作的效果
try{}finally{
lock.unLock();
}
}
2、如果发现有在执行的,那么等待一个一个执行
ReentrantLock lock=new ReentrantLock();//非公平锁,默认为false
ReentrantLock lock=new ReentrantLock(true);//公平锁,跟synchronized一致
try{
lock.lock();//如果锁被占用那么会等待,直到锁被释放
}finally{
lock.unLock();
}
3、如果发现有锁被占用,那么则等待指定时间,如果等待超时则不执行
可有效防止一致等待导致死锁
try{
if(lock.tryLock(5,TimeUnit.SECONDS)){//发现被占用则最大等待5秒,5秒内执行完可占用该锁,执行不完返回false
try{}finally{
lock.unLock();
}
}
}catch(InterruptedException e){}
4、如果发现被占用,则可中断正在进行的操作,释放该锁继续下一个操作
可有效防止锁被长时间占用,对资源的长时间消耗
try{
lock.lockInterruptibly();
}catch(InterruptedException e)finally{
lock.unLock();
}
3、ReentrantReadWriteLock(读写锁,共享锁)
排他锁:读写互斥、读读互斥、写写互斥
共享锁:读读共享、读写互斥、写写互斥
JDK1.5读写可能出现死锁,建议1.6以上
Lock详解的更多相关文章
- C++11 并发指南三(Lock 详解)(转载)
multithreading 多线程 C++11 C++11多线程基本使用 C++11 并发指南三(Lock 详解) 在 <C++11 并发指南三(std::mutex 详解)>一文中我们 ...
- C++11 并发指南三(Lock 详解)
在 <C++11 并发指南三(std::mutex 详解)>一文中我们主要介绍了 C++11 标准中的互斥量(Mutex),并简单介绍了一下两种锁类型.本节将详细介绍一下 C++11 标准 ...
- FLUSH TABLE WITH READ LOCK详解
FLUSH TABLES WITH READ LOCK简称(FTWRL),该命令主要用于备份工具获取一致性备份(数据与binlog位点匹配).由于FTWRL总共需要持有两把全局的MDL锁,并且还需要关 ...
- JAVA中synchronized和lock详解
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronize ...
- MySQL Metadata Lock详解
Metadata Lock 的作用: 要直接说出Metadata Lock 的作用.以我目前的文字功底是不行的.好在我可以通过一个例子来说明. 假设session 1 在正在执行如下的SQL语句 se ...
- 【java多线程】ConCurrent并发包 - Lock详解
synchronized的缺陷 我们知道,可以利用synchronized关键字来实现共享资源的互斥访问. Java 5在java.util.concurrent.locks包下提供了另一种来实现 ...
- ConCurrent并发包 - Lock详解(转)
synchronized的缺陷 我们知道,可以利用synchronized关键字来实现共享资源的互斥访问.Java 5在java.util.concurrent.locks包下提供了另一种来实现线 ...
- 详解synchronized与Lock的区别与使用
知识点 1.线程与进程 在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需要一个线程.关系是线程–>进程–>程序的大致组成结构.所以线程是程序执行流的最小单位 ...
- 【C/C++开发】C++11 并发指南三(std::mutex 详解)
本系列文章主要介绍 C++11 并发编程,计划分为 9 章介绍 C++11 的并发和多线程编程,分别如下: C++11 并发指南一(C++11 多线程初探)(本章计划 1-2 篇,已完成 1 篇) C ...
随机推荐
- 如何用EFCore Lazy Loading实现Entity Split
α角 与 β角 支持 现实生活 的 计算机系统,总有着两大偏差,第一个是 现实生活 与 计算机系统 的α角,另外一个是计算机系统的 逻辑设计 与 物理设计 的β角.举个栗子: α角:假设某个公司的商业 ...
- JVM CUP占用率过高排除方法,windows环境
jdk自带的jvisualvm可以看到程序CPU使用率,但是无法确定具体的线程,想要确定到具体的线程需要借用到微软的Process Explorer 具体排除方法: 一:打开资源管理器,找到cup占用 ...
- C# 向程序新建的窗体中添加控件,控件需要先实例化,然后用controls.add添加到新的窗体中去
C# 向程序新建的窗体中添加控件,控件需要先实例化,然后用controls.add添加到新的窗体中去 Form settingForm = new Form(); setForm deviceSet ...
- L1-035 情人节 (15 分)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805097018540032 以上是朋友圈中一奇葩贴:“2月14 ...
- 基本矩张量与strike.dip.rake的对应
basefp1=[ ]; M(,:)=[ ]; basefp2=[ -];M(,:)=[ - ]; basefp3=[ ];M(,:)=[ ]; basefp4=[ -];M(,:)=[ ]; bas ...
- js递归算法1+ 2+3.....100的和
function num(n){ if(n==1) return 1; return num(n-1)+n;}num(100);
- Codeforces Round #369 (Div. 2) C. Coloring Trees(简单dp)
题目:https://codeforces.com/problemset/problem/711/C 题意:给你n,m,k,代表n个数的序列,有m种颜色可以涂,0代表未涂颜色,其他代表已经涂好了,连着 ...
- Python机器学习(基础篇---监督学习(k近邻))
K近邻 假设我们有一些携带分类标记的训练样本,分布于特征空间中,对于一个待分类的测试样本点,未知其类别,按照‘近朱者赤近墨者黑’,我们需要寻找与这个待分类的样本在特征空间中距离最近的k个已标记样本作为 ...
- mysql 按类别之用一条SQL语句查询出每个班前10名学生数据
select * from 学生信息表 a where 10 > (select count(*) from 学生信息表 where 班级ID = a.班级ID and 班内名次 > a ...
- 18-09-11 软件rpm yum rm卸载 和批量删除
一 在Linux下删除文件用rm命令,具体用法如下: rm [选项] 文件 选项说明: -f -force 忽略不存在的文件,强制删除,无任何提示 -i --interactive 进行交互式地删除 ...