Lock接口

news/2024/12/2 21:46:35/文章来源:https://www.cnblogs.com/leizia/p/18582821

目录
  • Lock接口
    • Lock接口概述
    • API方法
    • 锁获取与中断
    • Synchronized和Lock的区别

Lock接口


大佬地址:

AQS(AbstractQueuedSynchronizer)源码深度解析(2)—Lock接口以及自定义锁的实现


Lock接口概述

Lock接口同样自于JDK1.5,它被描述成JUC中的锁的超级接口,所有的JUC中的锁都会实现Lock接口。

由于它是作为接口,到这里或许大家都明白了它的设计意图,接口就是一种规范。Lcok接口定义了一些抽象方法,用于获取锁、释放锁等,而所有的锁都实现Lock接口,那么它们虽然可能有不同的内部实现,但是开放给外部调用的方法却是一样的,这就是一种规范,无论你怎么实现,你给外界调用的始终是“同一个方法”!因此JUC中的锁也被常常统称为lock锁。

API方法

方法名称 描述
lock 获取锁,如果锁无法获取,那么当前的线程被挂起,直到锁被获取到,不可被中断。
lockInterruptibly 获取锁,如果获取到了锁,那么立即返回,如果获取不到,那么当前线程被挂起,直到当前线程被唤醒或者其他的线程中断了当前的线程。
tryLock 如果调用的时候能够获取锁,那么就获取锁并且返回true,如果当前的锁无法获取到,那么这个方法会立刻返回false
tryLcok(long time,TimeUnit unit) 在指定时间内尝试获取锁,当前线程在以下3种情况下会返回:
①如果当前线程在超时时间内获取了锁,那么返回true。
②如果当前的锁无法获取,那么当前的线程被挂起,直到当前线程获取到了锁或者当前线程被其他线程中断或者指定的等待时间到了。
③超时时间结束还没有获取到锁则返回false。
unlock 释放当前线程占用的锁
newCondition 返回一个与当前的锁关联的条件变量。在使用这个条件变量之前,当前线程必须占用锁。调用Condition的await方法,会在等待之前原子地释放锁,并在等待被唤醒后原子的获取锁

锁获取与中断

Thread类中有一个interrupt方法,可中断因为主动调用Object.wait()、Thread.join()和Thread.sleep()等方法造成的线程等待,以及使用lockInterruptibly方法和tryLock(time,timeUnit)尝试获取锁但是未获取锁而造成的阻塞,并且他们都将抛出InterruptedException异常,并且设置该线程的中断状态位为false。

但是对于因为调用lock()方法,或者因为无法获取Synchronized锁而被阻塞的线程,interrupt方法无法中断,仅会设置中断标志位为true,另外对于正常线程,同样仅会设置中断标志位为true,通知该线程应该被中断了。有一个特例是:被LockSupport.park()阻塞的线程也可以被中断,但是不会抛出异常,并且不会恢复标志位。

下面举例详细说明Lock接口的这四种方法的使用:假如线程A和线程B使用同一个锁LOCK,此时线程A首先获取到锁LOCK.lock(),并且始终持有不释放。

如果此时B要去获取锁,有四种方式:

LOCK.lock(): 此方式会使得B始终处于等待中,即使调用B.interrupt()也不能中断,除非线程A调用LOCK.unlock()释放锁。

LOCK.lockInterruptibly(): 此方式会使得B等待,但当调用B.interrupt()会被中断等待,并抛出InterruptedException异常,否则会与lock()一样始终处于等待中,直到线程A释放锁。

LOCK.tryLock(): 调用该方法时B不会等待,一次获取不到锁就直接返回false。

LOCK.tryLock(10, TimeUnit.SECONDS): 该处会在10秒时间内处于等待中,但当调用B.interrupt()会中断等待,并抛出InterruptedException。 10秒时间内如果线程A释放锁,线程B会获取到锁并返回true,否则10秒过后会直接返回false,去执行下面的逻辑。

Synchronized和Lock的区别

  1. 首先synchronized是java内置关键字,是jvm层面实现的;Lock是个java接口,可以代表JUC中的锁,通过java代码实现;synchronized关键字可以直接修饰方法,也可以修饰代码块,而lock只能修饰代码块。
  1. synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;即lock需要显示的获得、释放锁,synchronized隐式获得、释放锁。
  1. lock在等待锁过程中可以用lockInterruptibly()方法配合interrupt方法来中断等待,也可以使用tryLock()设置等待超时时间,而synchronized只能等待锁的释放,不能响应中断。
  1. synchronized是非公平锁,而Lock锁可以实现为公平锁或者非公平锁。
  1. Lock锁将监视器monitor方法,单独的封装到了一个Condition对象当中,更加的面向对象了,而且一个Lock锁可以拥有多个condition对象(条件队列),singal和signalAll可以选择唤醒不同的队列中的线程;而同一个synchronized块只能有一个监视器对象,一个条件队列。
  1. Lock可以提高多个线程进行读操作的效率,非常灵活。(可以通过readwritelock实现读写分离)。
  1. synchronized使用Thread.holdLock(监视器对象)检测当前线程是否持有锁,Lock可以通过lock.trylock或者isHeldExclusively方法判断是否获取到锁。

在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/845640.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

作文的深度解析

目录题目一:There is a growing awareness of the importance of digital literacy and skills in todays world题目二:Nowadays more and more college students have come to realize social practice and academic learning are equally important. 题目一:There is a gr…

终极Redis

Redis是世界上最流行的数据存储之一,功能丰富。这里有8个简单的步骤可以帮助你理解Redis的基本原理。1、什么是Redis?Redis(远程字典服务器)是一个多模式数据库,提供亚毫秒级的延迟。Redis背后的核心思想是缓存也可以作为一个完整的数据库。2、Redis采用Airbnb、Uber、Sla…

AI电动车头盔识别系统解决方案

AI电动车头盔识别系统解决方案通过在关键路段及社区入口等位置安装高清摄像头,AI电动车头盔识别系统解决方案结合深度学习算法对电动车骑行者进行实时监测,确保骑行者的安全。识别到未佩戴头盔的骑行者时,AI电动车头盔识别系统解决方案将立即联动附近的智能广播系统播放预先…

H5-17 选择器

CSS语法 规则由两个主要的部分构成:选择器,以及一条或多条声明(样式) 1、全局选择器可以与任何元素匹配,优先级最低,一般做样式初始化*{margin:0;padding:0;} 2、元素选择器HTML 文档中的元素,p、b、div、a、img、body等标签选择器,选择的是页面上所有这种类型的标签…

canal的安装搭建

canal介绍主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。 这里我们可以简单地把canal理解为一个用来同步增量数据的一个工具。canal能做什么数据库镜像 数据库实时备份 索引构建和实时维护 业务cache(缓存)刷新 带业务逻辑的增量数据处理首先开启mysql bi…

ctfshow 信息搜集web入门思路

做ctfshow的思路(web2)js前台拦截 无法使用f12打开代码 可以使用 ctrl+u 或者在网站前面加上view-source: 或者使用bp进行抓包(web4)robots.txt 中可能包含着信息(web5)phps源码泄露index.phps(web6)源码泄露 www.zip 泄露(web7)/.git/ 源文件泄露(web8)index.p…

分区函数partition by的基本用法【转载】

本章将和大家分享分区函数partition by的基本用法。本章将和大家分享分区函数partition by的基本用法(此处以MySQL为例)。废话不多说,下面我们直接进入主题。 一、建表语句-- 创建商品表 CREATE TABLE commodity (id int NOT NULL PRIMARY KEY COMMENT 主键,position VARCHA…

JavaSwing外观美化

系统可选风格 windows风格: com.sun.java.swing.plaf.windows.WindowsLookAndFeelwindows Classic风格: com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel Metal风格 ( Swing默认) :avax.swing.plaf.metal.MetalLookAndFeel Motif风格 : com.sun.java.swing.plaf…

网络架构

二层交换机电脑通过网线与交换机连接,形成局域网 发送信息时,电脑将信息发给交换机广播,传给其他电脑。 路由器为了避免广播风暴,引出路由器,通过路由器连接每个交换机 路由器上会配置网关,从而识别每个局域网,将消息发到特定的局域网中

MySQL底层概述—9.ACID与事务

大纲 1.ACID之原子性 2.ACID之持久性 3.ACID之隔离性 4.ACID之一致性 5.ACID的关系 6.事务控制演进之排队 7.事务控制演进之排它锁 8.事务控制演进之读写锁 9.事务控制演进之MVCC 10.事务隔离级别之隔离级别的类型 11.事务隔离级别之和锁的关系 12.事务隔离级别之隔离级别的控制…

信息安全概论复习4

数字签字和身份识别报文鉴别(接收方鉴别报文真伪)报文源鉴别(发方鉴别)报文宿鉴别(收方鉴别)报文时间性鉴别(能够挫败重播攻击) 初始向量法(事先约定一组初始向量Zi,Zi作为初始向量链接加密第i份报文Mi,只有对应才能还原,重点在加密)时间参数法(类似时间戳,第i份报文…

【知识】模拟退火

模拟退火算法!模拟退火 概念:温度(步长):初始温度 \(T\)终止温度衰减系数 $ 0 \sim 1$随机选择一个点: \(f(新点) - f(当前点) = \Delta E\)\(\Delta E < 0\) 跳到新点 \(\Delta E>0\) 以一定概率跳过去,概率为 \(e^{- \frac{\Delta E}{T}}\)过程如下图:题型:A…