java concurrency_Java Concurrency - Lock
Lock 是 Java API 提供的另一种线程同步机制,它提供了比 synchronized 关键字更为灵活、强大的锁定操作。
锁是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问,一次只允许一个线程获得锁,对共享资源的所有访问都需要先获得锁。不过,某些锁可能允许对共享资源并发访问,如 ReadWriteLock 的读锁。
synchronized 方法或语句的使用提供了对与每个对象相关的隐式监视器锁的访问,但却强制所有锁获取和释放均要出现在一个块结构中:当获取了多个锁时,它们必须以相反的顺序释放,且必须在与所有锁被获取时相同的词法范围内释放所有锁。
虽然 synchronized 方法和语句的范围机制使得使用监视器锁编程方便了很多,而且还帮助避免了很多涉及到锁的常见编程错误,但有时也需要以更为灵活的方式使用锁。例如,某些遍历并发访问的数据结果的算法要求使用 "hand-over-hand" 或 "chain locking":获取节点 A 的锁,然后再获取节点 B 的锁,然后释放 A 并获取 C,然后释放 B 并获取 D,依此类推。Lock 接口的实现允许锁在不同的作用范围内获取和释放,并允许以任何顺序获取和释放多个锁,从而支持使用这种技术。
随着灵活性的增加,也带来了更多的责任。不使用块结构锁就失去了使用 synchronized 方法和语句时会出现的锁自动释放功能。在大多数情况下,应该使用以下语句:
Lock l =...;
l.lock();try{//access the resource protected by this lock
} finally{
l.unlock();
}
锁定和取消锁定出现在不同作用范围中时,必须谨慎地确保保持锁定时所执行的所有代码用 try-finally 或 try-catch 加以保护,以确保在必要时释放锁。
Lock 提供了使用 synchronized 方法和语句所没有的其他功能,包括提供了一个非块结构的获取锁尝试 (tryLock())、一个获取可中断锁的尝试 (lockInterruptibly()) 和一个获取超时失效锁的尝试 (tryLock(long, TimeUnit))。
tryLock()
仅在调用时锁为空闲状态才获取该锁。如果锁可用,则获取锁,并立即返回值 true。如果锁不可用,则此方法将立即返回值 false。
此方法的典型使用语句如下:
Lock lock =...;if(lock.tryLock()) {try{//manipulate protected state
} finally{
lock.unlock();
}
}else{//perform alternative actions
}
此用法可确保如果获取了锁,则会释放锁,如果未获取锁,则不会试图将其释放。
tryLock(long, TimeUnit)
如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。
如果锁可用,则此方法将立即返回值 true。如果锁不可用,出于线程调度目的,将禁用当前线程,并且在发生以下三种情况之一前,该线程将一直处于休眠状态:
锁由当前线程获得;或者
其他某个线程中断当前线程,并且支持对锁获取的中断;或者
已超过指定的等待时间
如果获得了锁,则返回值 true。
如果当前线程:
在进入此方法时已经设置了该线程的中断状态;或者
在获取锁时被中断,并且支持对锁获取的中断,
则将抛出 InterruptedException,并会清除当前线程的已中断状态。
如果超过了指定的等待时间,则将返回值 false。如果 time 小于等于 0,该方法将完全不等待。
lockInterruptibly()
如果当前线程未被中断,则获取锁。
如果锁可用,则获取锁,并立即返回。如果锁不可用,出于线程调度目的,将禁用当前线程,并且在发生以下两种情况之一以前,该线程将一直处于休眠状态:
锁由当前线程获得;或者
其他某个线程中断当前线程,并且支持对锁获取的中断。
如果当前线程:
在进入此方法时已经设置了该线程的中断状态;或者
在获取锁时被中断,并且支持对锁获取的中断,
则将抛出 InterruptedException,并清除当前线程的已中断状态。
java concurrency_Java Concurrency - Lock相关推荐
- java.sql.SQLException: Lock wait timeout exceeded
2019独角兽企业重金招聘Python工程师标准>>> 先说我我的解决方法:找到锁住的线程然后kill掉. mysql> kill thr_id; 下面简单分析一下到底应该ki ...
- java.sql.SQLException: Lock wait timeout exceeded --转
org.springframework.dao.CannotAcquireLockException 的解决> 直接上 bug 的详细信息: 2012-03-12 15:20:31 XmlBea ...
- RocketMQ集群启动报错:java.lang.RuntimeException: Lock failed,MQ already started
启动RocketMQ集群后报错: java.lang.RuntimeException: Lock failed,MQ already startedat org.apache.rocketmq.st ...
- Java线程安全Lock、ReentrantLock、ReentrantReadWriteLock
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120750932 本文出自[赵彦军的博客] Java线程安全StampedLock ...
- 深入研究 Java Synchronize 和 Lock 的区别与用法
在分布式开发中,锁是线程控制的重要途径.Java为此也提供了2种锁机制,synchronized和lock.做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方. ...
- java volatile lock_Java并发学习笔记 -- Java中的Lock、volatile、同步关键字
Java并发 一.锁 1. 偏向锁 1. 思想背景 来源:HotSpot的作者经过研究发现,大多数情况下,锁不仅不存在多线程竞争,而且总是由同 一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁 ...
- 深圳Java培训:Lock线程锁
深圳Java培训:Lock线程锁 1:synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 在上面一篇文章中 ...
- JAVA多线程-基础Lock Condition 并发集合
代码的逻辑: 1)SProducer不停的产生number到queue中. 2)3个carrier不停的取出queue中的number. 3)如果queue中存在10个剩余number时,SProdu ...
- Java synchronized 与 lock (Reetrantlock)锁性能比较
使用synchronzied和ReetrantLock做一百万次自增运算性能比较,比较一个线程和多线程情况下 package com.lock.test; public class LockValue ...
最新文章
- [转]优化Flash性能
- html 图片剪裁控件,h5图像裁剪(基于canvas)插件Image-Clip
- 用Jenkins自动化构建Android和iOS应用
- python xlsxwriter 在 flask 中的使用
- Kaggle Titanic补充篇
- LeetCode 657. Judge Route Circle
- python groupby用法_Python 标准库实践之合并字典组成的列表
- 静态代码块无法对静态变量赋值的原因
- Realsense安装使用过程问题汇总
- java筛选excel数据_Excel中的筛选技巧有哪些,总结四种筛选技巧分享给大家
- [译]直观理解信息论
- openpcdet KeyError: ‘road_plane‘
- 单片机程序配置成开漏输出_单片机的GPIO配置
- curl encode
- 基于Python的豆果网食谱数据爬取及可视化分析系统
- 要有遥不可及的梦想,也要有脚踏实地的本事
- 无代码生产新模式探索
- 读薄《高性能MySql》(三)索引优化
- Zeppelin安装教程
- 计算机网络——Wireshark软件使用与协议分析(ARP协议、IP与ICMP分析)
热门文章
- assignment mismatch: 1 variable but uuid.NewV4 returns 2 values
- python3 实现 websocket server 解决中文乱码
- c#(winform)环境下使用动态链接库dll的详解
- 运动检测(前景检测)之——ViBe
- swing GeneralPath::cubicTo绘制平滑曲线
- Cissp-【第4章 通信与网络安全】-2021-3-14(476页-542页)
- 需要氪金吗_《天堂2:血盟》到底需不需要氪金?玩家:可以但是没有必要
- python判断路径是文件还是文件夹_python之判断是否是目录或文件
- asp.net接受表单验证格式后再提交数据_创建一个注册界面,并记录到数据库中...
- 推荐一款IDE开发工具插件GitToolBox