复习 part one

news/2024/12/13 19:38:30/

 synchronized 和 ReentrantLock的区别

synchronized 和 ReentrantLock 都是 Java 中提供的可重入锁,二者的主要区别有以下 5 个:

  1. 用法不同:synchronized 可以用来修饰普通方法、静态方法和代码块,而 ReentrantLock 只能用于代码块。ReentrantLock 在使用之前需要先创建 ReentrantLock 对象,然后使用 lock 方法进行加锁,使用完之后再调用 unlock 方法释放锁
  2. 获取锁和释放锁的机制不同:synchronized 是自动加锁和释放锁的,而 ReentrantLock 需要手动加锁和释放锁。
  3. 锁类型不同:synchronized 是非公平锁,而 ReentrantLock 默认为非公平锁,也可以手动指定为公平锁。
  4. 响应中断不同:ReentrantLock 可以响应中断,解决死锁的问题,而 synchronized 不能响应中断。
  5. 底层实现不同:synchronized 是 JVM 层面通过监视器实现的,而 ReentrantLock 是基于 AQS 实现的。

 ConcurrentHashMap的底层实现

为什么ConcurrentHashMap是线程安全的?

ConcurrentHashMap是线程安全的数组,是HashTable的替代品,同为线程安全,其性能要比HashTable更好 。

1、在 JDK 1.7 中它使用的是数组加链表的形式实现的,而数组又分为:大数组 Segment 和小数组 HashEntry。大数组 Segment 可以理解为 MySQL 中的数据库,而每个数据库(Segment)中又有很多张表 HashEntry,每个 HashEntry 中又有多条数据,这些数据是用链表连接的。

  • Segment 本身是基于 ReentrantLock 实现的加锁和释放锁的操作,这样就能保证多个线程同时访问 ConcurrentHashMap 时,同一时间只有一个线程能操作相应的节点,这样就保证了 ConcurrentHashMap 的线程安全了。

2、在JDK 1.8 中 ConcurrentHashMap 使用的是数组+链表/红黑树的方式实现的

  • 它是通过 CAS 或 synchronized 来实现线程安全的,并且它的锁粒度更小,查询性能也更高。

多态的实现原理 和 实现方法

多态的实现原理主要是依靠“动态绑定”和“虚拟方法调用”,它的实现流程如下:

  • 动态绑定(Dynamic Binding):指的是在编译时Java 编译器只能知道变量的声明类型,而无法确定其实际的对象类型。而在运行时,Java 虚拟机(JVM)会通过动态绑定来解析实际对象的类型。这意味着,编译器会推迟方法的绑定(即方法的具体调用)到运行时。正是这种动态绑定机制,使得多态成为可能。
  •  虚拟方法调用是在运行时根据实际对象的类型来确定要调用的方法的机制。当通过父类类型的引用变量调用被子类重写的方法时,虚拟机会根据实际对象的类型来确定要调用的方法版本,而不是根据引用变量的声明类型。

        通过方法重写和方法重载来实现

${} 和 #{} 有什么区别? 

  • ${} 和 #{} 都是 MyBatis 中用来替换参数的,它们都可以将用户传递过来的参数,替换到 MyBatis 最终生成的 SQL 中。
  • 它们二者的区别主要体现在:
  • 1、功能不同:${} 是直接替换,而 #{} 是预处理;
  • 2、使用场景不同:普通参数使用 #{},如果传递的是 SQL 命令或 SQL 关键字,需要使用 ${},但在使用前一定要做好安全验证;
  • 3、安全性不同:使用 ${} 存在安全问题,而 #{} 则不存在安全问题。
<select id="getUserById" resultType="com.example.demo.model.UserInfo">select * from userinfo where id=${id}
</select>

<select id="getUserById" resultType="com.example.demo.model.UserInfo">select * from userinfo where id=#{id}
</select>


http://www.ppmy.cn/news/1554833.html

相关文章

【JAVA】Java高级:Spring框架与Java EE—Spring框架概述(控制反转、依赖注入)

Java开发中&#xff0c;Spring框架是一个极为重要的工具&#xff0c;它为开发者提供了一个全面的编程和配置模型&#xff0c;能够简化企业级应用程序的开发。Spring框架通过控制反转&#xff08;IoC&#xff09;和依赖注入&#xff08;DI&#xff09;等核心概念&#xff0c;使得…

Pycharm访问MySQL数据库·下

1.数据库连接池 1.1 什么是连接池 连接池&#xff08;Connection Pool&#xff09;是一种用于管理数据库连接的技术。它通过预先创建一组数据库连接&#xff0c;并在需要时将这些连接提供给应用程序&#xff0c;从而避免了频繁地打开和关闭数据库连接的开销。 连接池在代码中…

基于Springboot企业oa管理系统【附源码】

基于Springboot企业oa管理系统 效果如下&#xff1a; 系统主页面 用户管理页面 公告信息管理页面 客户关系管理页面 车辆信息管理页面 工资信息管理页面 文件信息管理页面 上班考勤管理页面 研究背景 随着信息化时代的到来和企业OA管理理念的更新&#xff0c;企业面临着日益…

Android 开发者选项-模拟辅助显示设备

目录 概述使用开关的代码实现方式系统部分的处理:参考 概述 在Android开发中&#xff0c;模拟辅助显示设备通常指的是通过Android开发者选项来设置的一种虚拟显示设备&#xff0c;它允许开发者在一个设备上模拟另一个设备的显示特性。这种功能对于测试应用程序在不同屏幕尺寸、…

使用 Docker Compose 部署 Redis 主从与 Sentinel 高可用集群

文章目录 使用 Docker Compose 部署 Redis 主从与 Sentinel 高可用集群Redis 主从架构简介Redis Sentinel 简介配置文件1. 主节点配置 (redis-master.conf)2. 从节点配置 (redis-slave1.conf 和 redis-slave2.conf)redis-slave1.confredis-slave2.conf3. Sentinel 配置 (sentin…

使用requests和BeautifulSoup的Python爬虫示例

标题“使用requests和BeautifulSoup的Python爬虫示例”清晰地指出了这个Python脚本的主要功能和所使用的库。以下是一个基于这个标题的Python爬虫代码示例&#xff0c;它展示了如何使用requests库发送HTTP请求&#xff0c;并使用BeautifulSoup库解析HTML内容来抓取网页上的特定…

NodeJS后端,用express实现Web防扫描(网站防扫描)

NodeJS后端&#xff0c;用express实现的Web服务器&#xff0c;通过记录访问频率和行为模式&#xff0c;识别潜在的恶意活动&#xff0c;从而实现Web服务器防扫描功能。 代码&#xff1a; const express require(express); const app express();// 用于存储IP地址及其请求历…

【Email】基于SpringBoot3.4.x集成发送邮件功能

【Email】基于SpringBoot3.4.x集成发送邮件功能 摘要本地开发环境说明pom.xml启动类application.yaml写一个邮件模板定义模板引擎工具类定义一个邮件发送对象封装一个邮件发送器单元测试邮件模板单元测试发送邮件单元测试 邮件效果参考资料 摘要 在业务系统开发过程中&#xf…