【Java】Java核心要点总结:60

news2024/11/26 12:35:43

文章目录

  • 1. 乐观锁一定就是好的吗
  • 2. Synchronized和ReentrantLock有什么异同
  • 3. ReentrantLock是如何实现可重入性的
  • 4. 和Synchronized相比,可以重入锁ReentrantLock实现原理有什么不同
  • 5. AQS框架


在这里插入图片描述

1. 乐观锁一定就是好的吗


乐观锁并不一定好,它有自己的适用场景和局限性。

乐观锁的优点在于在低并发环境下表现良好,操作基本上都能够成功,不会阻塞其他线程的执行。此外,乐观锁没有锁带来的资源竞争和多线程间的上下文切换开销,对于高并发的场景下可以提供更好的性能表现。

但是,在高并发场景下乐观锁的表现往往受到影响,因为多个线程同时执行操作和检查比较,会出现重试次数增加的情况,进而增加了延迟和开销,降低了系统的吞吐量和性能。此时,悲观锁可能比乐观锁更适合解决问题,因为它能够阻塞其他线程,等待当前线程释放锁后再执行。

因此,选择使用何种锁策略需要根据实际情况进行综合考虑,包括需求、应用场景、并发程度以及编写代码的复杂程度等多个因素。在实际开发中也可以尝试将两种锁策略结合起来使用,根据情况动态选择最适合的策略,提升代码的效率和性能表现。


2. Synchronized和ReentrantLock有什么异同


Synchronized 和 ReentrantLock 在实现线程同步的过程中是很类似的,它们都可以通过获得锁控制并发访问,但也有一些不同点:

相关性:Synchronized 是 Java 语言内置的关键字,因此使用起来非常简便;而 ReentrantLock 是一个基于 Java API 的类,需要手动创建和管理。

获取方式:Synchronized 锁时很容易获取的,在使用 synchronized 关键字修饰方法或代码块时,都自动获得了对象的锁;而 ReentrantLock 需要显式地调用 lock() 锁定资源,并且在使用后还需要 unlock() 解锁,否则就会发生死锁等问题。

可扩展性:ReentrantLock 拥有 Synchronized 不具备的额外功能,比如支持可重入锁、公平锁和非阻塞锁等。

性能差异:相较于 Synchronized,ReentrantLock 执行效率更快,特别是在遇到高并发场景时,ReentrantLock 更容易保证线程执行的顺序。但是,当并发量较小的时候,Synchronized 的效率可能会更高,此外 Synchronized 内部包装了锁的升级降级机制,使得效率在低竞争、低并发的情况下也比较高。

在选择 Synchronized 和 ReentrantLock 的时候,需要根据具体的实现场景和需求来选择合适的锁策略,两者都有其优势和适用场地,不能单纯的从性能方面进行取舍判定。并且,在锁的使用中一定要注意避免死锁等问题的发生,保证线程安全。


3. ReentrantLock是如何实现可重入性的


ReentrantLock 实现可重入性的核心在于内部维护了一个 holdCount 属性,用于记录锁被当前线程持有的次数。初次获得锁时,这个值为 1,每次进入同步块时加 1,退出时减 1。只有当 holdCount 的值为 0 时,表示锁已被完全释放。

实现代码大致如下:

public class ReentrantLockDemo {
    private final ReentrantLock lock = new ReentrantLock();
    public void method() {
        lock.lock();
        try {
            // do something
            method2();
        } finally {
            lock.unlock();
        }
    }

    private void method2() {
        lock.lock();
        try {
            // do something
        } finally {
            lock.unlock();
        }
    }
}

在上面的代码中,method() 方法获取了锁后又调用了 method2() 方法,而 method2() 方法也需要获取同一个锁。因为当前线程已经获得了该锁,所以可以再次获取,这就是 ReentrantLock 可重入的原因。

此外,ReentrantLock 还有许多高级特性,比如公平锁、读写锁等,它们都基于可重入锁的思想衍生而来,充分利用了 ReentrantLock 所提供的灵活性和可扩展性。


4. 和Synchronized相比,可以重入锁ReentrantLock实现原理有什么不同


和 Synchronized 相比,重入锁 ReentrantLock 的实现原理有一些不同:

底层实现:ReentrantLock 是基于 Java API 实现的类,而 Synchronized 则是语言级别支持的关键字。在底层实现上,ReentrantLock 基于 AbstractQueuedSynchronizer (AQS)来实现线程同步,而 Synchronized 则是直接依赖 JVM 实现的。

获得和释放锁的方式:ReentrantLock 提供了 lock() 和 unlock() 方法,用于手动获取和释放锁,同时也提供 tryLock() 方法来尝试获得锁;而 Synchronized 则是由 JVM 自动管理的,当线程进入 synchronized 修饰的代码块时自动获取监视器锁,退出时自动释放。

重入性:ReentrantLock 可以支持可重入锁机制,即线程可以多次获取同一把锁,而 Synchronized 已经默认支持了重入锁机制。

可定制性:ReentrantLock 有更高的可定制性,如公平锁、非公平锁、可实现读写分离等特殊场景下需要使用的扩展功能;而 Synchronized 则不具备这些扩展功能。

性能表现:在低竞争、低并发的情况下,Synchronized 不比 ReentrantLock 差,在高并发、高竞争的情况下,ReentrantLock 的性能优于 Synchronized。

ReentrantLock 和 Synchronized 都可以用于实现线程同步,但 ReentrantLock 的可定制性和可重入性底层基于 AQS 实现,在某些高并发场景下表现更优;而 Synchronized 的使用成本低,实现简单,适合在一些简单场景下使用。


5. AQS框架


AQS(AbstractQueuedSynchronizer)是一个提供了一个简单框架用于实现阻塞锁和相关的同步器的抽象类。

AQS 的核心思想就是通过一个双向队列来完成线程的排队和等待,它维护了一个 Volatile 的 state 变量,可以理解为 status。state 的修改只能由持有独占锁的线程完成,其他线程可以通过 CAS 操作竞争修改它,以此控制对共享资源的访问和保证线程间的互斥访问。

通过这种方式,AQS 屏蔽了大部分与并发操作相关的细节,并提供了基础的同步操作,如 acquire(获取锁) 和 release(释放锁),同时还可以扩展出诸如 Semaphore、CountDownLatch、ReentrantLock 等高级同步器,这些同步器都是基于 AQS 框架实现的。

在使用 AQS 时,开发者需要负责编写 acquire 和 release 方法来实现同步控制逻辑,通常会通过一个内部类来代表各个需要同步的状态,如 Sync 类在 ReentrantLock 中就代表了_HOLD、_WAITING 和 _NONE 三个状态,然后针对不同的状态下具体的执行逻辑编写相应的 acquire 和 release 方法,在 acquire 方法中尝试获取锁,如果失败则加入等待队列并挂起自己,等到获取到锁或者被中断时再次尝试获取并执行相应的操作;在 release 方法中释放锁并唤醒等待队列中的线程。

AQS 是一个基于队列和状态变量实现的同步框架,屏蔽了底层调度和同步机制的细节,提供了一套标准的用于实现阻塞锁和同步器的 API,并通过各种扩展支持了更多高级同步器的实现。




在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python实现将一张图片贴到另一张图片上

Python实现将一张图片贴到另一张图片上 在图像处理中,往往需要将多张图片合成一张图片。这里介绍使用Python实现将一张图片贴到另一张图片上的方法。 准备工作 在实现之前,我们需要安装Python的图像处理库Pillow和numpy。 可以通过pip进行安装&#…

创建一个SpringBoot项目

Spring的诞生是为了简化JAVA程序的开发的 快速开发Spring而诞生的 SpringBoot为了快速开发Spring而诞生的一个框架 1)什么是SpringBoot?为什么要学它?(重要) Spring是包含了众多工具方法的IOC容器 SpringBoot就是Spring框架的脚手架,它的存在就是为了快…

软考A计划-系统架构师-官方考试指定教程-(2/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

chatgpt赋能python:Python屏幕输入介绍:了解命令行输入的基本知识

Python屏幕输入介绍:了解命令行输入的基本知识 Python是一种使用广泛的编程语言,用于编写各种类型的应用程序,包括图形用户界面应用程序和基于命令行的应用程序。对于基于命令行的应用程序来说,屏幕输入非常重要。本文将介绍Pyth…

Object.assign用法

Object.assign用法 Object.assign是什么? 首先了解下Object.assign()是什么。我们先看看ES6官方文档是怎么介绍的? Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。简单来说,就是Obj…

stm32超声波测距代码

操作思路: 初始化时将trig和echo端口都置低,首先向给trig 发送至少10 us的高电平脉冲(模块自动向外发送8个40K的方波),然后等待,捕捉 echo 端输出上升沿,捕捉到上升沿的同时,打开定时…

(附源码)python音乐电台推荐系统的设计与实现 毕业设计 301210

音乐电台推荐系统 摘 要 随着人类向信息社会的不断迈进,风起云涌的信息时代正掀起一次新的革命,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个B/S结构的音乐电台推荐系统来管理音乐电台信息&#xff0…

OpenAI 接口文档-(中文版)-(一)

介绍 Introduction 您可以通过来自任何语言的 HTTP 请求、我们的官方 Python 绑定、我们的官方 Node.js 库或社区维护的库与 API 进行交互。 若要安装官方 Python 绑定,请运行以下命令: pip install openai 要安装官方的 Node.js 库,请在 No…

chatgpt赋能python:Python将空格改为换行符

Python将空格改为换行符 在Python编程中,经常需要对字符串进行处理,其中包括将空格替换为换行符。这篇文章将会介绍如何使用Python来实现这个目标,并分享一些关于字符串处理的技巧。 为什么要将空格改为换行符 将空格改为换行符可以让文本…

chatgpt赋能python:Python屏蔽一段代码

Python屏蔽一段代码 在Python编程中,有时我们需要屏蔽一段代码以便于调试或者测试。在很多情况下,我们可能不想删除这段代码,因为需要在将来的某个时间再次使用它。为了解决这个问题,我们可以使用Python中的注释语句或者条件语句…

Vue3中集成Unreal 5.2 像素流(Pixel Streaming插件)

目录 1. 创建一个Unreal项目2. 启用Pixel Streaming插件3. 下载Unreal 5.2对应的Pixel Streaming Infrastructure4. 创建一个Vue项目5. 推流方式一:使用Unreal Engine 5.26. 推流方式二:打包项目参考资源: 1. 创建一个Unreal项目 默认大家都…

机器人的免费使用方法

目录 一、机器人是什么? 二、机器人免费使用的方法: 第一点:电脑端 第二点:手机端 三、结语: 一、机器人是什么? 博主理解:方便生活,比Siri更加高级,能够智能的对我们…

chatgpt赋能python:Python就业前景分析

Python就业前景分析 Python已成为全球最流行的编程语言之一,因其易学、易用、高效、可扩展性强等特点,Python在各个领域都发挥着重要作用。Python的发展和应用迅猛,拥有Python编程经验的工程师在各个领域都面临着广泛的就业机会。 Python的…

推荐一个Edge浏览器中的一个好用问答插件。

目录 ChatGPT介绍:一、ChatGPT是什么?二、ChatGPT发展:三、ChatGPT 优点:四、Edge浏览器插件五、结语: ChatGPT介绍: 一、ChatGPT是什么? ChatGPT 是一个基于语言模型 GPT-3.5 的聊天机器人,ChatGPT模型是Instruct GPT的姊妹模型(siblingmodel&#x…

Sql Server 自动备份

Sql Server 自动备份 文章目录 Sql Server 自动备份1. 打开SQL Server,在管理下找到”维护计划”,右键点击”维护计划向导”,如图;2. 再次点击维护计划向导3. 在选择维护任务下勾选”备份数据库”、”清楚维护任务”4.选择需要备份…

ChatGPT应用于软件测试中的切入口(干货!)

以上均为本人原创,转载请说明出处,谢谢! 如果您觉得这篇文章还不错的话,请点击关注,转发,再看; 全是干货,话不多说 开搞! 1. 测试想法生成器 可以使用ChatGPT技术&…

宝塔反代教程+国内服务器访问openai api接口+502 Bad Gateway问题解决!

前言 宝塔反代教程国内服务器访问openai api接口502 Bad Gateway问题解决! 此方法最简单快捷,没有复杂步骤,不容易出错,即最简单,零代码、零部署的方法。 实现前提 一台海外VPSOpenAI官方的API_KEYChatGPT网站系统源码 ChatGP…

手机上谷歌的方法有哪些

google的方法 一般情况下,我们打开谷歌都是提示无法显示页面的,如图 先百度搜索下载一个能切换IP地址的软件 下载压缩包客户端到桌面上(没安装winRAR的童鞋请安装一下) 把客户端解压到桌面,双击里面的exe文件 输入注册好的账户和密码&#xf…

Spring项目启动报错java.lang.NoClassDefFoundError : javax/xml/soap/SOAPException

文章目录 1.背景2.原因3.解决办法4.参考资料 1.背景 今天,在新设备上启动一个之前的项目的时候,发现启动不了了,报错 java.lang.NoClassDefFoundError : javax/xml/soap/SOAPException2.原因 网上查询了一下,大概的原因就是因为…

bert预训练梳理

BERT (Bidirectional Encoder Representation Transformers) 是在2018年由Google AI 团队发布的,虽然在此前刚发布不久的ELMo模型已经相比过去带来了很大的改善,但是BERT在各主流任务上取得的成绩仍然是一个质的飞跃。可以说,此后2-3年陆续出…