Lock基础

C# lock实战指南:从基础到高级应用 本文深入探讨C#中lock关键字在多线程编程中的应用,从基础概念、核心原理到高级实战场景。详细解析了如何使用lock解决数据竞争问题,对比了静态锁与实例锁的区别,并深入剖析了其底层Monitor机制。同时,文章重点讨论了锁粒度优化、死锁避免策略,以及在异步编程中lock的替代方案,为开发者提供了一套从入门到精通的完整指南。 阅读详情

LOCK基础

1 Lock原理

synchronized关键字将会隐式地获取锁,但是将锁的获取和释放固化了,也就是先获取再释放。优点是简化了同步管理,缺点是扩展性没有锁的获取和释放来得好。

Lock lock = new ReentrantLock(); lock.lock();
try {
} finally {
lock.unlock(); }

在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放。不要将获取锁的过程写在try块中,因为如果在获取锁(自定义锁的实现)时发生了异常, 异常抛出的同时,也会导致锁无故释放。
在这里插入图片描述
在这里插入图片描述
两大块内容:

  • 队列同步器AbstractQueuedSynchronizer(以下简称同步器)
  • 以及常用Lock接口的实现ReentrantLock

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

可以这样理解二者之间的关系:

  • 锁是面向使用者的,它定义了使用者与锁交 互的接口(比如可以允许两个线程并行访问),隐藏了实现细节;
  • 同步器面向的是锁的实现者, 它简化了锁的实现方式,屏蔽了同步状态管理、线程的排队、等待与唤醒等底层操作。

锁和同步器很好地隔离了使用者和实现者所需关注的领域。

队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组 件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获 取线程的排队工作,并发包的作者(Doug Lea)期望它能够成为实现大部分同步需求的基础。重写同步器指定的方法时,需要使用同步器提供的如下3个方法来访问或修改同步状态:

  • getState():获取当前同步状态。
  • setState(int newState):设置当前同步状态。
  • compareAndSetState(int expect,int update):使用CAS设置当前状态,该方法能够保证状态 设置的原子性。

在这里插入图片描述
同步器提供的模板方法基本上分为3类:

  • 独占式获取与释放同步状态、
  • 共享式获取与释放
  • 同步状态和查询同步队列中的等待线程情况。

自定义同步组件将使用同步器提供的模板方法 来实现自己的同步语义。

2 重入锁ReentrantLock

重入锁ReentrantLock,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对
资源的重复加锁。除此之外,该锁的还支持获取锁时的公平和非公平性选择。
ReentrantLock虽然没能像synchronized关键字一样支持隐式的重进入,但是在调用lock()方 法时,已经获取到锁的线程,能够再次调用lock()方法获取锁而不被阻塞。
事实上,公平的锁机制往往没有非公平的效率高,但是,并不是任何场景都是以TPS作为唯一的指标,公平锁能够减少“饥饿”发生的概率,等待越久的请求越是能够得到优先满足。

3 读写锁ReentrantReadWriteLock

ReentrantLock是排他锁,这些锁在同一时刻只允许一个线 程进行访问,而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。

ReadWriteLock仅定义了获取读锁和写锁的两个方法,即readLock()方法和writeLock()方法,而其实现——ReentrantReadWriteLock。

4 Condition接口

Condition定义了等待/通知两种类型的方法,当前线程调用这些方法时,需要提前获取到 Condition对象关联的锁。Condition对象是由Lock对象(调用Lock对象的newCondition()方法)创 建出来的,换句话说,Condition是依赖Lock对象的。
获取一个Condition必须通过Lock的newCondition()方法。

Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public void conditionWait() throws InterruptedException {
	lock.lock(); 
	try {
		condition.await(); 
	} finally {
		lock.unlock();
	} 
}
public void conditionSignal() throws InterruptedException { lock.lock();
	try {
		condition.signal(); } finally {
		lock.unlock();
	}
}

其他补充

1.Are Locks AutoCloseable?

https://stackoverflow.com/questions/6965731/are-locks-autocloseable
在这里插入图片描述在这里插入图片描述在这里插入图片描述

2 Hadoop中实现的AutoCloseableLock

想要用try-resource-with,实现close方法即可。

package org.apache.hadoop.util;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
import com.google.common.annotations.VisibleForTesting;

/**
 * This is a wrap class of a ReentrantLock. Extending AutoCloseable
 * interface such that the users can use a try-with-resource syntax.
 */
public class AutoCloseableLock implements AutoCloseable {

  private final Lock lock;

  /**
   * Creates an instance of {@code AutoCloseableLock}, initializes
   * the underlying lock instance with a new {@code ReentrantLock}.
   */
  public AutoCloseableLock() {
    this(new ReentrantLock());
  }

  /**
   * Wrap provided Lock instance.
   * @param lock Lock instance to wrap in AutoCloseable API.
   */
  public AutoCloseableLock(Lock lock) {
    this.lock = lock;
  }

  // 定义一个获取锁的方法
  public AutoCloseableLock acquire() {
    lock.lock();
    return this;
  }
  //释放锁
  public void release() {
    lock.unlock();
  }
  //close方法是必须的
  @Override
  public void close() {
    release();
  }

  /**
   * A wrapper method that makes a call to {@code tryLock()} of
   * the underlying {@code Lock} object.
   *
   * If the lock is not held by another thread, acquires the lock, set the
   * hold count to one and returns {@code true}.
   *
   * If the current thread already holds the lock, the increment the hold
   * count by one and returns {@code true}.
   *
   * If the lock is held by another thread then the method returns
   * immediately with {@code false}.
   *
   * @return {@code true} if the lock was free and was acquired by the
   *          current thread, or the lock was already held by the current
   *          thread; and {@code false} otherwise.
   */
  public boolean tryLock() {
    return lock.tryLock();
  }

  /**
   * A wrapper method that makes a call to {@code isLocked()} of
   * the underlying {@code ReentrantLock} object.
   *
   * Queries if this lock is held by any thread. This method is
   * designed for use in monitoring of the system state,
   * not for synchronization control.
   *
   * @return {@code true} if any thread holds this lock and
   *         {@code false} otherwise
   */
  @VisibleForTesting
  boolean isLocked() {
    if (lock instanceof ReentrantLock) {
      return ((ReentrantLock)lock).isLocked();
    }
    throw new UnsupportedOperationException();
  }

  /**
   * See {@link ReentrantLock#newCondition()}.
   * @return the Condition object
   */
  public Condition newCondition() {
    return lock.newCondition();
  }
}

【UVM基础】关于lock_model 关于lock_model 阅读详情

相关推荐

大麦网回流票监控实战:如何利用sign参数和cookie实现自动抢票(避坑指南)

本文详细介绍了如何利用sign参数和cookie构建大麦网回流票监控系统,实现自动化抢票。通过分析大麦网票务系统的核心机制、获取关键身份凭证、逆向分析sign签名算法,并构建完整的监控系统,帮助用户高效捕捉回流票机会。文章还提供了实战避坑指南和合法合规的注意事项,确保系统稳定运行且符合平台规则。

weixin_28568819的博客 411

Java7新特性 - AutoCloseable

???? 概述 JDK在1.7之后出现了自动关闭类的功能,该功能的出现为各种关闭资源提供了相当大的帮助,这里我们谈一谈自动关闭类。 JDK1.7之后出现了一个重要的接口,以及改造了一个重要的方法结构: 1、AutoCloseable自动关闭接口 2、try(){}–catch{}–finally{} 相应的 一些资源也实现了该接口,如PreparedStatement、Connection、InputStream、OutputStream等等资源接口。 一句话: 实现AutoCloseable接口,覆盖c

marvintian518的博客 1509

2、TCGA数据处理(差异分析前处理)

注意:1、是R语言中用于读取文本文件并创建数据框的函数。它可以从文本文件中读取数据并将其存储为数据框的形式,每一列代表一个变量,每一行代表一个观察值。2、括号要成对,不能少了;3、file = 'TCGA-LIHC.htseq_counts.tsv'引号可以是单或双引号,建议单;4、逗号主要中英文,都是用英文模式才没错;5、.tsv文件类型必须要有,不能删除,否则读不进来;6、上面代码将TCGA-LIHC.htseq_counts.tsv文件读入并赋值给count1。

PLW_12的博客 2665

Java 自动释放锁的几种实现

Java 自动释放锁的几种实现

m0_71682321的博客 2265

GT-suite v2016的下载和安装

1 写在前面 GT-suite 是一款用来做内燃机仿真的软件。在安装过程中遇到很多问题,网上的安装教程也大都抄来抄去,试着安装了几遍都没有成功。最终在贴吧一个老哥的帖子里找到了解决办法,但是老哥的帖子也不是很详细,所以做了这个详细版本的教程。 GT-suite v2016安装包: 链接:https://pan.baidu.com/s/1JZPgJ8_-J-L8rV84-eHedQ 提取码:uj...

kisssshot的博客 2万+

DrissionPage实战:5分钟搞定京东滑块验证码自动登录(附完整轨迹生成代码)

本文详细介绍了如何使用DrissionPage工具实现京东滑块验证码的自动化登录,包括环境配置、滑块缺口识别、拟人化轨迹生成算法及完整登录流程。通过物理运动学模型和智能识别技术,有效提升验证码破解成功率,适用于电商自动化场景。

weixin_29229055的博客 243

hdfs dn锁拆分

目前社区已经基本完成锁的拆分,包括实现读写锁 AutoCloseDataSetLock、实现管理类 DataSetLockManager、将全局锁拆分成读写锁(其中锁的拆分在社区是逐步完成的,首先是将所有的锁替换成BLOCK_POOL类型的锁,然后再逐步将锁粒度细化成BLOCK_POOL+VOLUME),此外也解决了已知的死锁问题。当前已经将社区所有已完成的子任务及其相关依赖的pr合并,进行了读写性能测试。,例如dn内部的数据迁移,则需要加BlockPool级别的写锁,此时则不能加volume级别的锁。

uflswe的专栏 882

Vivado ILA调试全攻略:从HDL实例化到Block Design的5个实战技巧

本文全面解析了Vivado集成逻辑分析仪(ILA)的五种核心调试方法,涵盖从HDL代码实例化到Block Design集成的实战技巧。详细对比了不同方法的优缺点与适用场景,并重点介绍了如何利用Debug Hub高效管理多时钟域复杂调试,旨在帮助FPGA开发者精准定位问题,显著提升板级调试效率。

weixin_29214199的博客 376

基于设计模式,实现分布式锁的资源管理

基于设计模式,实现分布式锁的资源管理

u013367040的博客 1406

066、AR 应用中虚拟物体漂移抖动?IMU 融合 + 光流追踪的视觉里程计优化方案

AR应用中虚拟物体漂移抖动优化方案 摘要:针对AR应用中虚拟物体漂移抖动问题,提出一种IMU融合与光流追踪的视觉里程计优化方案。关键点包括:1) 采用IMU预积分技术处理高频噪声,通过中值积分计算帧间相对运动约束;2) 使用金字塔LK光流追踪像素运动,通过中值偏差法剔除异常值;3) 构建10帧滑动窗口的紧耦合优化框架,将IMU预积分约束和光流重投影约束联合优化。实验表明,该方法有效解决了时间戳未对齐导致的"跳舞箭头"现象,在手机端实现稳定30fps的AR定位精度,漂移误差降低至厘米级。特别提醒:IMU与视觉

ai技术增长的博客 161

电力系统分析 | Matlab实现源荷场景生成---蒙特卡洛法场景生成启发式同步回带削减

电力系统分析 | Matlab实现源荷场景生成---蒙特卡洛法场景生成启发式同步回带削减

前程算法屋的博客 812

【datanode FsDataSetImpl lock held time above threshold】

datanode FsDataSetImpl lock held time above threshold 导致查询超时。

weixin_38930013的博客 670

UDS诊断服务基础详解之七-31服务

本节内容主要是讲解诊断服务中的31服务,包含31服务的使用场景,请求报文格式,响应报文格式,以及举例对31服务进行相关的说明

车载网络小D的博客 5625

JUC基础(三)—— Lock锁 及 AQS

我们第一章提到了JUC的几大组成部分,其中就包含了“锁”,实际上Lock锁在业务上的使用频率恐怕是最高的,它弥补了很多synchronized关键字无法顾及的场景,灵活而强大。今天我们就来看一看这个强大的Lock以及它的核心类

战斧的博客 3460

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java基础-线程同步之Lock锁基础学习

线程同步之Lock锁基础学习 无论是 同步代码块还是同步方法 我们都只是理解上的 加锁解锁 根本不能很清晰的看到 哪里加了锁 哪里解锁 而Lock锁 就很清晰的能够看到加锁解锁代码 1.5推出 同步方式:Lock Lock锁 里面被锁起来的代码一旦执行过程中出现代码报错,则永远不会自动释放锁,那么其他线程永远无法进入 而同步代码块会自动释放锁 所以我们想到了无论什么时候都必须执行lock.unLock()方法,所以Lock锁要使用必须结合try{}finally{}。 Demo.java public cl

二丫的博客 159

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java基础——Day23——Lock和TCP传输

Day 23 一、Lock 1.1 定义 Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。 锁是控制多个线程对共享资源进行访问的工具。 通常,锁提供了对共享资源的独占访问。 一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁 1.2 Lock的实现类 ReentrantLock ReentrantReadWriteLock.ReadLock ReentrantReadWriteLock.WriteLock 二、Reentrant Lock(掌握)

夏天的风清澈的酒 210

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java基础—接口Lock

接口Lock 显式锁接口Lock的定义为: public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); Condition ne

m0_72882572的博客 410

Lock锁<一> _ 基础

一、Lock接口 并发包下java.util.concurrent.locks.Lock接口实现锁的功能,必须显示地获取和释放锁。如下图所示,是Lock的类图。

爱我所爱0505 738

[C#基础]说说lock到底锁谁?

[C#基础]说说lock到底锁谁? https://www.cnblogs.com/wolf-sun/p/4209521.html 转载于:https://www.cnblogs.com/hwubin5/p/10687425.html

weixin_30472035的博客 93

【JUC基础】04. Lock锁

java.util.concurrent.locks为锁定和等待条件提供一个框架的接口和类,说白了就是锁所在的包。

有一只柴犬的专栏 605

java基础之线程 Lock接口

把java基础撸一边,从简单的开始。线程部分:特别说明来源:抄了的网站:java并发编程-LockLock的需要在java中,已经有了synchronize来当锁,为什么还要Lock呢?被synchronize修饰的方法,当一个线程获得了对应的锁之后,并执行该代码块时,其他线程只能一直等待,其他线程获取锁的情况会有三种。1:执行完该代码块,然后线程释放对锁的占有2:线程执行发生异常,此时jvm会让...

weixin_33982670的博客 93

铂金1:探本溯源-为何说Lock接口是Java中锁的基础

欢迎来到《并发王者课》,本文是该系列文章中的第14篇。 在黄金系列中,我们介绍了并发中一些问题,比如死锁、活锁、线程饥饿等问题。在并发编程中,这些问题无疑都是需要解决的。所以,在铂金系列文章中,我们会从并发中的问题出发,探索Java所提供的锁的能力以及它们是如何解决这些问题的。 作为铂金系列文章的第一篇,我们将从Lock接口开始介绍,因为它是Java中锁的基础,也是并发能力的基础。 一、理解Java中锁的基础:Lock接口 在青铜系列文章中,我们介绍了通过synchronized关键字实现对方法和代码块加锁

MetaThoughts 213

JAVA基础:Lock锁

因为synchronized锁在使用时存在着一定的不足,所以在jdk1.5时,提供了一个java 并发 工具包。里面包含了许多与多线程操作相关的工具类,其中就包含了Lock系列。

weixin_65346668的博客 665

java lock锁_Java Lock 锁相关的技术基础

问:说说 synchronized 与 Lock 的区别及优劣点?你用过 Java Lock 的哪些实现类?答:关于 synchronized 与 Lock 的区别及优劣点主要如下:synchronized 是 Java 的一个内置特性关键字,而 Lock 是 Java 的一个接口类;synchronized 在发生异常时会自动释放线程占用的锁,而 Lock 在发生异常时(不发生也一样)需要主动在...

weixin_39981624的博客 66

lock 线程 java_Java多线程基础——Lock类

之前已经说道,JVM提供了synchronized关键字来实现对变量的同步访问以及用wait和notify来实现线程间通信。在jdk1.5以后,JAVA提供了Lock类来实现和synchronized一样的功能,并且还提供了Condition来显示线程间通信。Lock类是Java类来提供的功能,丰富的api使得Lock类的同步功能比synchronized的同步更强大。本文章的所有代码均在Lock...

weixin_30974667的博客 148
上一篇: [iceberg]3-spark调用iceberg入口分析
下一篇: [DN优化] [锁优化] [HDFS-15150] Introduce read write lock to Datanode
王小禾
博客等级 码龄11年 80粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值