同步机制是Java并发编程中最重要的机制之一,锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能防止多个线程同时访问共享资源(但是也有例外,比如读写锁)。Java中可以使用synchronized关键字实现锁的功能,用synchronized修饰的方法或者代码块,在锁和获取和释放时隐式的,这给我们的操作带来了更好的便捷性。Lock接口是JAVA SE 5之后新增的接口,它提供了与synchronized关键字类似的同步功能,只是在使用的时候需要显示的获取锁和释放锁,但是却拥有了锁释放和锁获取的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。
synchronized关键字隐式的获取与释放锁将锁的获取与释放固化了,这种方式简化了同步的管理,但是可扩展性没有显示的锁获取与释放更方便,例如,在一个场景中,先获得锁A,然后再获取锁B,当锁B获得后,释放锁A同时获取锁C,当锁C获得后,再释放B的同时据偶去锁B,一次类推。这样的场景下,synchronized关键字就没有那么容易实现了,而使用Lock却非常的方便。
Lock的使用非常的简单,下面是Lock的使用方式示例 :
Lock lock = new ReentrantLock() ;
lock.lock() ;
try{
//do something }finally{
lock.unlock() ;
}
在finally块中释放锁,能保证在每次获取锁之后,最终都能被释放。要注意的是,不要将锁的获取写在try块中,因为如果在获取锁(自定义锁的实现)时发生了异常,异常抛出的同时,也会导致锁无故的释放。
Lock接口对于synchronized的优势主要有以下几点 :
(1)尝试非阻塞的获取锁 ,当前线程尝试获取锁,如果这一时刻没有被其他线程获取到,则成功获取并持有锁
(2)能被中断的获取锁 ,我们知道synchronized关键字修饰的代码块或者方法,阻塞队列中的线程是不会响应中断的。Lock则不同,获取到锁的线程被中断时,中断异常会被抛出,同时释放锁。
(3)超时释放锁,在指定的截止时间之前获取锁,如果超时未获取到,则返回 。
Lock是一个接口,它定义了锁获取与释放的基本操作,Lock的API如下 :
Java中的Lock的更多相关文章
-
Java中的Lock与synchronized
并发编程学习笔记之Lock与synchronized 一.什么是可重入锁 Lcok在Java中是一个接口,一般在面试问题中问到的可能是ReentrantLock与synchronized的区别.Ree ...
-
从源码浅析Java中的Lock和AbstractQueuedSynchronizer
在之前的文章中我也曾经介绍过Lock,像ReentrantLock(可重入锁)和ReentrantReadWriteLock(可重入读写锁),这些所我们在说的时候并没有详细的说明它们的原理,仅仅说明了 ...
-
Java中的Lock锁
Lock锁介绍: 在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景.高效的性能,java还提供了Lock接口及其实现类ReentrantLock和 ...
-
Java中的Lock接口
Synchronized & Lock synchronized 是Java语言中的关键字,由monitorenter,monitorexit两个指令实现.JVM会将monitorenter指 ...
-
【原创】关于java中的lock
看了下java中高性能锁Lock,其中有如下: ReentrantLock:独占锁,类似于synchronized,不过锁的粒度更小 ReadWriteLock(ReentrantReadWriteL ...
-
Java 并发:Lock 框架详解
摘要: 我们已经知道,synchronized 是java的关键字,是Java的内置特性,在JVM层面实现了对临界资源的同步互斥访问,但 synchronized 粒度有些大,在处理实际问题时存在诸多 ...
-
JAVA中synchronized和lock详解
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronize ...
-
JAVA中LOCK
原文链接:http://www.cnblogs.com/dolphin0520/p/3923167.html 一.synchronized的缺陷 我们知道如果一个代码块被synchronized修饰了 ...
-
Java中Lock,tryLock,lockInterruptibly的区别
转载自:https://www.zhihu.com/question/36771163/answer/68974735 ReentrantLock 锁有好几种,除了常用的lock ,tryLock , ...
随机推荐
-
Web安全之CSRF攻击
CSRF是什么? CSRF(Cross Site Request Forgery),中文是跨站点请求伪造.CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任, ...
-
思考之一——PM(Project Manager)
摘自:http://blog.csdn.net/moreevan/article/details/6697806
-
java异步操作实例
1.异步操作过程实例: A.开启一个线程一直执行耗时操作 B.通过每隔多长多件轮询线程是否实行完毕,thread.isCompleted() C.执行完毕后,通过回调函数返回真实信息 一个调用者在调用 ...
-
c语言 字符版 简易2048
花了两个多小时,用最蠢的方法写的……最简陋版…… 还不确定这么写逻辑对不对…… #include <iostream> #include <cstdio> #include & ...
-
innosetup 安装静默安装msi,指定安装路径的方法
自己看了很久帮助,分号的用法确实不太好用,湿了这个东东估计很多人会用到,发出来给大家参考. Filename: "{app}/msiexec.exe";Parameters: &q ...
-
Android 各版本信息 (*)
The following tables show the release dates and key features of all Android operating system updates ...
-
G - RPG的错排(错排)
Description 今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁.RPG给他机会让他猜猜,第一次猜:R是公主,P是草儿 ...
-
回溯法、数独与N阶可达问题
回溯法是剪了枝的穷举,这是字面上的说法,不太好理解,不如讲解实例来的酸爽,于是引出了N阶可达问题: 有N个国家,每个国家有若干城市,小明要从中国(任意一个城市)出发,遍历所有国家(假设这个遍历顺序已经 ...
-
Java中的增强 for 循环 foreach
foreach 是 Java 中的一种语法糖,几乎每一种语言都有一些这样的语法糖来方便程序员进行开发,编译期间以特定的字节码或特定的方式来对这些语法进行处理.能够提高性能,并减少代码出错的几率.在 J ...
-
一个大数据方案:基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎
网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并提供了大量的配置定制选项.由于网络爬虫只负责网络资源的抓取,所以,需要一个分布式搜索引擎, ...