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

相关文章

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入