java各种锁有什么区别

eccd63839ed64b6eb3eb4639acdfcae8.jpgJava 虚拟机(JVM)中有几种不同类型的锁,每种锁都有其特定的用途和性能特点。下面我将为你介绍几种常见的锁:

 

  1.独占锁(也称为悲观锁):

      1.synchronized:这是 Java 提供的一种内置的独占锁,它可以保证同一时刻只有一个线程可以访问同步块。synchronized 锁用于保护共享资源,避免多个线程同时访问导致数据不一致。它有两种作用域:一种是方法级别的,一种是代码块级别的。

      2.ReentrantLock:这是 Java.util.concurrent.locks 包提供的一种独占锁,功能类似于 synchronized,但是提供了更多高级功能,如有条件的锁、公平锁等。

  2.共享锁:

      1.ReadWriteLock:这是一种特殊的锁,允许多个线程同时读取共享资源,但只有一个线程可以写入。这种锁适合于读多写少的场景。

  3.乐观锁:

      1.使用版本号:乐观锁通常不使用锁机制,而是通过版本号(或 CAS - Compare And Swap)来控制并发。当多个线程尝试更新同一个变量时,只有通过了 CAS 操作的线程才能成功更新变量,其他的线程则会被推迟,直到前面的线程更新完成。这种方式假设冲突很少发生,所以效率比较高。

  4.无锁:

      1.使用原子操作:Java 的 atomic 包提供了一系列的原子操作类,如 AtomicInteger, AtomicLong 等,它们通过 CAS 操作来保证操作的原子性,而不需要使用锁。

  5.自旋锁:

      1.当一个线程在等待另一个线程释放锁的时候,不会立即放弃 CPU,而是不断检查锁是否被释放,这样可以减少线程上下文切换的开销,提高效率。但是,如果锁被长时间持有,自旋锁可能会导致 CPU 资源浪费。

  6.公平锁:

      1.公平锁保证线程按照请求锁的顺序来获取锁,避免饥饿现象。

  7.非公平锁:

      1.非公平锁不保证线程获取锁的顺序,因此一个线程可能连续多次获得锁,也可能长时间得不到锁。

  8.可中断锁:

      1.可以响应中断的锁,当线程等待锁的时候,如果线程被中断,它可以选择退出。

  9.锁消除:

      1.JVM 会对一些同步块自动消除,即在某些情况下,如果检测到没有线程竞争,JVM 会消除同步块,使其变成非同步块,提高效率。

  10.锁粗化:

      1.如果一系列连续的操作天然地构成一个锁扩展,JVM 会把这些操作合并成一个大的同步块,减少锁的粒度。

  11.轻量级锁:

      1.当锁是闲置状态时,锁会膨胀为重量级锁,这是一种为了提高性能的做法。

  12.偏向锁:

      1.偏向锁是一种锁的优化策略,它试图将锁挂载到线程上,如果一个线程获得了锁,那么锁会偏向于该线程,不会立即膨胀为重量级锁。

每种锁适用于不同的场景,开发者可以根据实际情况选择合适的锁。需要注意的是,不当的使用锁可能会导致性能问题,如死锁、活锁、资源争用等问题,所以在使用锁的时候需要特别小心。

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

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

相关文章

股指期货的套利策略存在哪些风险?

股指期货套利的交易策略。它能够纠正市场上不合理的价格偏差,将价格拉回到正常的轨道。套利交易以其稳健的收益吸引着投资者,但同时也容易让人陷入一个误区——认为套利是无风险的。实际上,套利同样存在风险,只是相对于纯粹的投机…

问题易如反掌?5个常用的AI人工智能助手推荐

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 如今的人工智能技术正以惊人的速度改变着我们的生活方式和工作方式。作为这一变革的关键驱动力,人工智能不仅在科技…

短剧CPS分销系统框架+资源对接是怎么对接的?

目录 前言: 一、前端uniapp内容有什么? 二、后台管理 三、搭建CPS需要准备什么? 总结: 前言: 目前短剧目前在国内是非常的热门,观看的人群非常的多。如果希望能够通过推广短剧来做副业的话&#xff0c…

深入理解PreparedStatement

预处理 Overridepublic boolean login(String username, String userpwd) {Connection con DBUtils.getConnection();try {if(con ! null){PreparedStatement pstmt con.prepareStatement("select username,userpwd from " " users where username? and us…

硬核!288页Python核心知识笔记(附思维导图,建议收藏)

不少朋友在学习Python时,都会做大量的笔记,随着学习进度的增加,笔记越来越厚,但有效内容反而越来越少。 今天就给大家分享一份288页Python核心知识笔记,相较于部分朋友乱糟糟的笔记,这份笔记更够系统地总结…

【Vue3】具名插槽

【Vue3】具名插槽 背景简介开发环境开发步骤及源码 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日子。本文内…

AcWingTrie树

字典树的应用背景: 看以下几个题: 1、给出n个单词和m个询问,每次询问一个单词,回答这个单词是否在单词表中出现过 答:简单!map,短小精悍。 好。下一个 每次询问一个前缀,回答询问是多少个单词的前缀。2、给出n个单词和…

零基础入门转录组数据分析——机器学习算法之boruta(训练模型)

零基础入门转录组数据分析——机器学习算法之boruta(训练模型) 目录 零基础入门转录组数据分析——机器学习算法之boruta(训练模型)1. boruta基础知识2. boruta(Rstudio)——代码实操2. 1 数据处理2. 2 构建…

【SQL Server】默认端口与自定义端口

目录 第4章:默认端口与自定义端口 SQL Server 默认端口号 更改 SQL Server 端口号 使用自定义端口的好处 示例:更改 SQL Server 端口为 1434 示例代码:更新连接字符串 安全注意事项 第4章:默认端口与自定义端口 SQL Serve…

只有4%知道的Linux,看了你也能上手Ubuntu桌面系统,Ubuntu简易设置,源更新,root密码,远程服务...

创作不易 只因热爱!! 热衷分享,一起成长! “你的鼓励就是我努力付出的动力” 最近常提的一句话,那就是“但行好事,莫问前程"! 与辉同行的董工说​:​守正出奇。坚持分享,坚持付出,坚持奉献&#xff0c…

深化理解电子商务领域的“二清”风险与合规路径

在电子商务的快速发展中,“二清”风险成为了不容忽视的话题。这一现象不仅触及金融监管红线,还潜藏诸多风险,包括资金安全、信息泄露、合规性挑战以及监管盲点。鉴于“二清”问题的复杂性与潜在危害,电商平台必须采取有效措施&…

NLB快速实现IPv4服务的负载均衡

阿里云网络型负载均衡NLB(Network Load Balancer)支持TCP、UDP和TCPSSL协议,提供了强大的四层负载均衡能力。 为了实现IPv4服务的负载均衡,需要快速创建一个NLB实例,并将来自客户端的访问请求转发至后端服务器。 操作…

AI-WEB-1.0 靶机

AI-WEB-1.0 一、安装靶机环境 下载地址: https://www.vulnhub.com/entry/ai-web-1,353/ 下载压缩文件打开 开启虚拟机 二、信息收集 1.查看NAT模式IP段 编辑–>虚拟网络编辑器 御剑2014查IP 找到ip之后就访问网站 用扫描目录的工具扫描当前网站的目录 访问…

MongoDB change stream 详解

文章目录 什么是 Chang Streams实现原理故障恢复使用场景Spring Boot整合Chang Stream 什么是 Chang Streams Change Stream指数据的变化事件流,MongoDB从3.6版本开始提供订阅数据变更的功能。 Change Stream 是 MongoDB 用于实现变更追踪的解决方案,类…

职场进阶还是智商税?一文看六西格玛绿带培训的真面目

随着企业对精细化管理需求的日益增长,六西格玛绿带培训逐渐成为职场人士争相追逐的热门课程。它不仅能够帮助学员掌握先进的质量管理工具,还能培养逻辑思维、数据分析能力以及团队合作精神,这些都是现代职场不可或缺的软实力。 职场助力or智商…

ElasticSearch优化实战:打造高性能搜索引擎的秘籍

在当今这个大数据时代,信息的海量增长对搜索技术提出了前所未有的挑战。用户不仅需要快速准确地从数以亿计的数据中找到所需信息,还希望搜索引擎能够提供个性化和智能化的搜索体验。ElasticSearch作为市场上领先的搜索引擎,因其强大的全文搜索…

Spring框架和Maven项目搭建

Spring Spring框架是一个用于构建企业级应用程序的开源Java框架。它提供了一个全面的编程和配置模型,用于开发现代化的Java应用程序。 Spring从早期的大量XML配置逐渐演变为采用注解和自动配置的方式,显著减少了配置的工作量。同时,Maven的…

mysql更改密码后,若依 后端启动不了解决方案

我原先的mysql 密码是 数字字符串 我想改成000 纯数字 改完之后,连接的数据库的代码 也更改后 ,后端启动不了 因为原先 密码数字字符串 不需要用引号" " 括起来 我改成纯数字 需要用 " " 括起来 如下图 然后就可以运行成功了