当前位置: 首页 > news >正文

复习 part one

 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.lryc.cn/news/501582.html

相关文章:

  • 【工业机器视觉】基于深度学习的水表盘读数识别(3-数据标注与转换)
  • python数据分析之爬虫基础:selenium详细讲解
  • Tips--解决esptool经pyinstaller打包后无法使用的问题
  • Apache DolphinScheduler 限制秒级别的定时调度
  • Oracle 数据库创建用户并分配只读的权限
  • 2个GitHub上最近比较火的Java开源项目
  • 【jvm】为什么要有GC
  • 【Rhino】【Python】根据contour创建地形mesh
  • 蓝桥杯软件赛系列---lesson1
  • NanoLog起步笔记-1
  • 汽车车牌标记支持YOLO,COCO,VOC三种格式标记,4000张图片的数据集
  • leetcode33.搜索旋转排序数组
  • Ansible自动化运维(三)playbook剧本详解
  • 通过PS和Unity制作2D动画之二:IK的使用
  • 图像边缘检测原理和常用检测算子及MATLAB实现
  • 企业经营数据分析系统:提升决策能力的利器
  • 【49】AndroidStudio构建其他人开发的Android项目
  • Oracle 数据库中SERIALLY_REUSABLE包是一种特殊的包类型
  • css基础记录
  • Python后端 -- 万字长文全面解析Django框架
  • el-thee懒加载删除某条数据 ,el-thee懒加载重置,el-thee刷新某个节点
  • 【PyQt5教程 四】Qt Designer 样式表(styleSheet)实现基本小部件的自定义动态效果和资源浏览器背景添加方法
  • 【git】--- 通过 git 和 gitolite 管理单仓库的 SDK
  • 计算机网络之NAT、代理服务、内网穿透、内网打洞
  • 2024-金盾信安杯线上赛 WP
  • MySQL 基础架构
  • 汽车升级到底应不应该设置“可取消“功能
  • 【MySQL】mysql中的事务
  • 大语言模型(LLM)与智能机器人的应用分析
  • Inno Setup 学习笔记(一)