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 ...
随机推荐
- GIT 初始化 中文编码、自动换行
解决中文编码: git config --global core.quotepath false git config --global gui.encoding utf-8 解决git log 中文 ...
- 洛谷P1073 最优贸易
题面要求的是一个差值,即走过一条路径能找到的路径上最大值-最小值. 那么相当于跑一遍最长路和一遍最短路,当然不是概念上的最长路最短路,这里把dis[v]的松弛改成用路径上传递来的最大/最小值维护,而不 ...
- 实训任务05 MapReduce获取成绩表的最高分记录
实训任务05 MapReduce获取成绩表的最高分记录 实训1:统计用户纺问次数 任务描述: 统计用户在2016年度每个自然日的总访问次数.原始数据文件中提供了用户名称与访问日期.这个任务就是要获取 ...
- 重新复习~ 为了重新找工作 - > XMLHttpRequest2.0 Jsonp nodeType 节点 webpack基本搭建 闭包的一句话总结
XMLHttpRequest2.0 1.可以设置超时 (xhr.timeout = 1000; ontimeout()函数) 2.支持FormData对象管理表单数据(new FormData 方法: ...
- complex类的定义和实现
#include<iostream> #include<cmath> using namespace std; class complex { public: complex( ...
- windows分驱
步骤/方法 1 鼠标右击“计算机” 2 选择“管理”标签 3 打开“计算机管理”窗口 选择“磁盘“>>”存储管理“,打开”磁盘管理“页面 如图: 右键单击选择要压缩的磁盘(本例 ...
- 机器学习之朴素贝叶斯&贝叶斯网络
贝叶斯决决策论 在所有相关概率都理想的情况下,贝叶斯决策论考虑基于这些概率和误判损失来选择最优标记,基本思想如下: (1)已知先验概率和类条件概率密度(似然) (2)利用贝叶斯转化为后验概 ...
- wps实现自动编码
1.打开wps,点击“开始”菜单,选择“标题1”样式,右键选择“修改样式” 2.在修改样式界面,左键点击“格式”选择“编号”选项 3.在打开的界面选择“多级编码”,选中一个样式,点击“自定义”按钮 4 ...
- tcl实现批量压缩文件夹
tcl脚本本身对字符串的处理比较简单,所以想着用这个也实现下: proc main {} { puts "请输入路径:" set strpath "E:\\123&quo ...
- 简单网络管理协议(SNMP)
SNMP是TCP/IP网络中应用最为广泛的网络管理协议,工作在TCP/IP参考模型的应用层,是一种面向无连接的协议 功能:SNMP的功能是使网络设备之间能方便的交换管理信息,从而使网络管理员了解网络运 ...