专栏首页WindCoder并发学习笔记14-Lock接口

并发学习笔记14-Lock接口

使用方式

Java SE5之前,在协调对共享对象的访问时可用的机制只有synchronized和volatile。Java 5.0之后,并发包中新增了Lock接口及其相关实现类。

使用synchronized关键字将隐式获取锁,简化了同步的管理。

Lock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作,所有加锁和解锁的方法都是显式的,使用方式如下:

Lock lock = new ReentrantLock();
lock.lock();
try {

} finally{
    lock.unlock();
}

finally块中释放锁,目的是保证在获取到锁之后,最终能释放锁。

不要将获取锁的过程卸载try块中,因为如果在获取锁(自定义锁的实现)时发生了异常,异常抛出的同时,也会导致锁无故释放

Lock接口提供的synchronized所不具备的特性

  • 尝试非阻塞地获取锁:当前线程尝试获取锁,如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁。
  • 能被中断地获取锁:与synchronized不同,获取到锁的线程能够响应中断,当获取到锁的线程被中断时,中断异常将会被抛出,同时锁会被释放。
  • 超时获取锁:在指定的截止时间之前获取锁,若截止时间到了仍旧无法获取锁,则返回。

Lock的API

Lock是个接口,定义了锁获取和释放的基本操作,API如下表:

方法名称

描述

void lock()

获取锁,调用该方法当前线程会获取锁,当锁获取后,从该方法返回,

void LockInterruptribly() throws InterruptedException

可中断地获取锁,和lock()方法的不同之处在于该方法会响应中断,即在锁的获取中可以中断当前线程。

boolean tryLock()

尝试非阻塞的获取锁,调用该方法后立即返回,如果能够获取则返回true,否则返回false。

boolean tryLock(long time, TimeUnit unit) throws InterruptedExceptions

超时的获取锁,当前线程在以下3种情况下会返回:1.当前线程在超时时间内获得了锁。2.当前线程在超时时间内被中断。3.超时时间结束,返回false。

void unlock()

释放锁。

Condition newConition()

获取等待通知组件,该组件和当前的锁绑定,当前线程只有获取了锁,才能调用该组件的eait()方法,而调用后,当前线程将释放锁。

Lock接口的实现基本都是通过聚合了一个同步器的子类来完成线程访问控制的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 并发学习笔记12-线程基础(上)

    现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process)。

    汐楓
  • 并发学习笔记13-线程基础(下)

    Volatile可以修饰字段(成员变量),就是告知程序任何对该变量的访问均需从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可...

    汐楓
  • Java基础小结(三)

    以上这些类是传统遗留的,在Java2中引入了一种新的框架-集合框架(Collection)

    汐楓
  • Java并发-14.Lock工具

    悠扬前奏
  • Java 并发开发:Lock 框架详解

    我们已经知道,synchronized 是java的关键字,是Java的内置特性,在JVM层面实现了对临界资源的同步互斥访问,但 synchronized 粒度...

    Java团长
  • 每日一学之socket编程(二)

    图片来自与百度图片 为什么要引入线程 在实际的开发中,一个ServerSocket服务端最小都有几十上百个客户端进行访问。当数据处理不及时,就会造成连接阻塞。 ...

    企鹅号小编
  • 【原创】Java并发编程系列16 | 公平锁与非公平锁

    上一篇提到重入锁 ReentrantLock 支持两种锁,公平锁与非公平锁。那么这篇文章就来介绍一下公平锁与非公平锁。

    java进阶架构师
  • 分享一款JVM线程堆栈在线分析工具

    JVM大家可能都知道是个什么玩意-Java虚拟机,但是到底是个什么鬼?相信即使工作3-5年的程序员可能也不大了解。 ? 如题所述,今天与大家分享的是如何分析...

    小柒2012
  • 分享一款JVM线程堆栈在线分析工具

    JVM大家可能都知道是个什么玩意-Java虚拟机,但是到底是个什么鬼?相信即使工作3-5年的程序员可能也不大了解。

    小柒2012
  • JAVA线程之ThreadLocal与栈封闭(六)

    PS:这次说了线程封闭的概念,其实很容易理解只要知道在ThreadLocal是JVM内部维护了一个Map就可以了。栈封闭没有纤细概述,跟局部变量是一个概念。

    IT故事会

扫码关注云+社区

领取腾讯云代金券