1-Java基础篇-3

简介: 本文详解Java集合与并发核心机制:HashMap扩容(阈值0.75、2倍扩容、节点重哈希优化);ConcurrentHashMap演进(1.7分段锁 vs 1.8 CAS+synchronized);线程创建4种方式及Runnable/Callable差异;synchronized与Lock锁对比;以及线程池队列满时的处理策略。

14. 讲一讲HashMap的扩容机制

  1. 在jdk1.8中,resize方法是在hashmap中的键值对大于阀值(0.75)时或者初始化时,就调用resize方法进 行扩容;
  2. 每次扩展的时候,都是扩展2倍;
  3. 扩展后Node对象的位置要么在原位置,要么移动到原偏移量两倍的位置。

在putVal()中,我们看到在这个函数里面使用到了2次resize()方法,resize()方法表示的在进行第一 次初始化时会对其进行扩容,或者当该数组的实际大小大于其临界值值(第一次为12) , 这个时候在扩 容的同时也会伴随的桶上面的元素进行重新分发,这也是JDK1.8版本的一个优化的地方,在1.7 中,扩容之后需要重新去计算其Hash值,根据Hash值对其进行分发,但在1.8版本中,则是根据 在同一个桶的位置中进行判断(e.hash & oldCap)是否为0,重新进行hash分配后,该元素的位置 要么停留在原始位置,要么移动到原始位置+增加的数组大小这个位置上

15. ConcurrentHashMap 底层具体实现知道吗?

ConcurrentHashMap 是一种线程安全的高效Map集合

底层数据结构:

  • JDK1.7的 ConcurrentHashMap 底层采用 分段的数组+链表 实现,
  • JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。

JDK1.7

首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段 数据时,其他段的数据也能被其他线程访问。

在JDK1.7中,ConcurrentHashMap采用Segment + HashEntry的方式进行实现

一个 ConcurrentHashMap 里包含一个 Segment 数组。Segment 的结构和HashMap类似,是一 种数组和链表结构,一个 Segment 包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构 的元素,每个 Segment 守护着一个HashEntry数组里的元素,当对 HashEntry 数组的数据进行修 改时,必须首先获得对应的 Segment的锁。

Segment 是一种可重入的锁 ReentrantLock,每个 Segment 守护一个HashEntry 数组里得元 素,当对 HashEntry 数组的数据进行修改时,必须首先获得对应的 Segment 锁。

JDK1.8

在JDK1.8中,放弃了Segment臃肿的设计,取而代之的是采用Node + CAS + Synchronized来保 证并发安全进行实现,synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲 突,就不会产生并发 , 效率得到提升

16. 创建线程的四种方式

  1. 继承 Thread 类;
  2. 实现 Runnable 接口;
  3. 实现 Callable 接口;
  4. 使用匿名内部类方式

17. runnable 和 callable 有什么区别

  • Runnable 接口 run 方法无返回值;Callable 接口 call 方法有返回值,是个泛型,和Future、 FutureTask配合可以用来获取异步执行的结果
  • Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理;Callable 接口 call 方法允许抛出 异常,可以获取异常信息 注:Callalbe接口支持返回执行结果,需要调用FutureTask.get()得到, 此方法会阻塞主进程的继续往下执行,如果不调用不会阻塞。

18. 加锁的方式有哪些 ?

使用synchronized关键字

使用Lock锁

synchronized和Lock有什么区别 ?

首先synchronized是Java内置关键字,在JVM层面,Lock是个Java类;

synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。

synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁; 而 lock 需要自己加锁和释放锁,如果使用不当没有 unLock()去释放锁就会造成死锁。

通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。

19. 如果你提交任务时,线程池队列已满,这时会发生什么

有俩种可能:

  1. 如果使用的是无界队列 LinkedBlockingQueue,也就是无界队列的话,没关系,继续添加任务到 阻塞队列中等待执行,因为 LinkedBlockingQueue 可以近乎认为是一个无穷大的队列,可以无限存放 任务
  2. 如果使用的是有界队列比如 ArrayBlockingQueue,任务首先会被添加到ArrayBlockingQueue 中ArrayBlockingQueue 满了,会根据maximumPoolSize 的值增加线程数量,如果增加了线程数量 还是处理不过来,ArrayBlockingQueue 继续满,那么则会使用拒绝策略RejectedExecutionHandler 处理满了的任务,默认是 AbortPolicy
目录
相关文章
|
2月前
|
存储 缓存 NoSQL
4-Redis篇-1
本文详解Redis在项目中的三大应用:热点缓存、业务数据存储(如验证码、排行榜)及分布式锁;涵盖5种基础数据类型、RDB/AOF双持久化机制、惰性+定期混合过期策略,以及8种内存淘汰策略。
173 19
|
2月前
|
Java 应用服务中间件 Maven
5-微服务篇-1
本文详解SpringBoot核心机制:①自动装配原理——通过@SpringBootApplication→@EnableAutoConfiguration→AutoConfigurationImportSelector→spring.factories加载条件化配置类;②启动流程三阶段:初始化、上下文创建、自动配置;③常用起步依赖、配置文件类型(properties/YAML)及加载优先级;④四种运行方式。
261 23
|
2月前
|
缓存 NoSQL 关系型数据库
4-Redis篇-3
Redis与Memcached在数据结构、集群支持及持久化上差异显著;内存满时Redis可淘汰或报错;与MySQL一致性可通过删缓存+双写、MQ异步、过期策略等方案分级保障;缓存穿透用布隆过滤器,击穿靠预热、永不过期或加锁限流。(239字)
185 8
|
2月前
|
存储 NoSQL 算法
4-Redis篇-2
本文详解Redis集群架构与核心机制:采用哨兵集群(1主2从+3哨兵)保障高可用;对比主从复制、哨兵、Cluster分片三大方案;解析主从同步的全量/增量复制流程;说明Cluster基于16384哈希槽的分片存储原理;简述MULTI/EXEC等事务命令及实际使用情况。(239字)
170 6
|
2月前
|
缓存 监控 数据可视化
实战指南:通过API高效获取全球股票数据分析
本文为量化交易者提供StockTV API实战指南:涵盖美股/日股数据获取、实时行情查询、多周期K线调用、技术指标计算及可视化(mplfinance),并详解WebSocket实时推送、缓存优化与容错机制,助你高效构建金融分析系统。(239字)
|
2月前
|
安全 前端开发 NoSQL
基于Spring Boot+Vue的中西医一体化诊所HIS源码,具备高安全性、模块化设计与易扩展性
云诊所系统是基于Spring Boot+Vue的中西医一体化HIS源码,支持电子病历、处方管理、药房进销存、医保结算及会员服务。具备高安全性、模块化设计与易扩展性,已落地百余项目,适配社区卫生站、门诊部等基层医疗机构。
209 7
|
2月前
|
机器学习/深度学习 监控 算法
基于YOLO26的电梯内电瓶车检测识别(中英文双版) | 附完整源码与效果演示
本文提出了一种基于YOLO26深度学习算法的电梯内电瓶车检测识别系统。该系统通过部署在电梯内的摄像头实时采集视频流,利用训练好的YOLO26模型对画面中的目标进行检测,准确识别出自行车和电动摩托车两类目标,从而实现对违规行为的智能预警和拦截。
|
2月前
|
SQL 存储 关系型数据库
3-MySQL篇-3
本文详解MySQL索引核心概念:回表查询(先查索引再查主键)、覆盖索引(索引含所有查询字段,避免回表)、左前缀原则(联合索引最左匹配);并列举索引失效场景及建索引最佳实践。
143 0
|
2月前
|
SQL 存储 缓存
3-MySQL篇-4
本文详解MySQL性能优化三大维度:设计上选合适引擎(InnoDB/MyISAM)、字段类型与范式;功能上优化索引、缓存、分库分表;架构上主从复制、读写分离。另涵盖超大分页优化、慢查询定位及EXPLAIN执行分析方法。(239字)
136 2
3-MySQL篇-4
|
2月前
|
存储 前端开发 Java
1-Java基础篇-6
本文详解JVM核心机制:运行时数据区(程序计数器、虚拟机栈、本地方法栈、堆、方法区)、堆栈区别、类加载器体系(启动/扩展/系统/自定义)及双亲委派模型,并介绍Java 8新特性(Stream流常用操作filter/map/sorted等、Lambda、Optional等)。
121 1

热门文章

最新文章