Lock接口和synchronized同步 对比它有什么优势?

2024-08-30 17:44

本文主要是介绍Lock接口和synchronized同步 对比它有什么优势?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Lock接口比同步方法和同步块提供了更具扩展性的锁操作。他们允许更灵活的结构。可以具有完全不同的性质,并且 可以支持多个相关类的条件对象
它的优势有:
1.可以使锁更公平
2. 可以使线程在等待所的时候响应中断
3.可以让线程尝试获取锁,并在无法获取锁的时候立即返回或者等待一段时间
4.可以在不同的范围,一不同的顺序获取和释放锁(lock)
整体上说,Lock是synchronized的扩展版,Lock提供了无条件的,可轮询的(tryLock方法),定时的(tryLock的带参方法),可中断(lockInterruptibly),可多条件队列(newCondition)锁操作。另外Lock的实现类基本都支持非公平锁和公平锁,synchronized只支持非公平锁,当然,大部分情况下,非公平锁是高效的选择

补充

可轮询

可轮询是在多个线程或并发编程中,某个操作或资源可以被反复检查状态来防止线程被阻塞

Lock具有的更大的扩展性

  • Lock 提供了**tryLock()**方法
    • 对比synchronized不同,后者一旦进入同步代码块或方法,就会被阻塞,直到获取锁
    • 这个方法就是线程只是尝试获取锁,但是不会被阻塞
  • 可中断的锁获取->lockInterruptibly()
    这个方法允许线程在尝试获取锁的时候能够响应中断请求
  • 定时获取锁->trylock(long time,TimeUnit unit)
    • 这个方法允许在指定时间内获取锁,如果超出时间,可以选择放弃锁->避免线程长时间等待锁
  • 灵活的锁释放
    • 使用unlock()方法来释放,比起sychronized中->线程退出同步块/方法 会自由很多
  • 读写锁(ReadWriteLock)
    • 允许多个线程同时读操作,独占写操作

更灵活的结构

  • 使用lock()和unlock()来获取和释放
  • Lock是一个接口,ReentrantLock(可重入锁)和ReetrantReaderWriteLock 等,这些不同的实现适用于不同的开发场景,前者提供了可重入 的功能,后者读写分离
  • 使用Condition对象支持多个条件变量。也就是说允许为一个锁创建多个条件变量,这样,锁可以通过不同的条件变量的线程

更公平

  • 对于公平锁,等待时间最长的线程会优先获取锁
  • Lock接口提供了一个接口,可选择公平锁或者非公平锁。所谓公平锁就是按照他们请求锁的顺序来进行的 。但是synchronized默认非公平,线程可能会被随机唤醒来获取锁,从而导致“饥饿”状态(某线程长时间无法获取锁)

这篇关于Lock接口和synchronized同步 对比它有什么优势?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121502

相关文章

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

基于Redisson实现分布式系统下的接口限流

《基于Redisson实现分布式系统下的接口限流》在高并发场景下,接口限流是保障系统稳定性的重要手段,本文将介绍利用Redisson结合Redis实现分布式环境下的接口限流,具有一定的参考价值,感兴趣... 目录分布式限流的核心挑战基于 Redisson 的分布式限流设计思路实现步骤引入依赖定义限流注解实现

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为