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

Java线程及线程池的相关的问题

1、线程池有哪些状态

线程池在Java中有五种状态:

RUNNING(运行状态)线程创建后默认进入此状态,能够接受新任务并处理任务队列中的任务。如果不调用关闭方法,线程池会一直保持此状态。

SHUTDOWN(关闭状态) 调用shutdown()方法后进入此状态。现成池不再接受新任务,但会继续处理任务队列中的任务,直到到全部完成。

STOP(停止状态)调用shutdownNow()方法后进入此状态。线程池不再接受新任务,同时会中断正在执行的任务,并放弃任务队列中的任务。

TIDYING(整理状态)当所有任务(包括任务队列中的任务)都执行完毕,且活动线程数降为0时,现成池进入此状态。在此状态下会调用terminated()方法。

TERMINATED(销毁状态)线程池在执行完terminated()方法后进入此状态,表示线程池完全关闭。

2、线程有哪些状态

线程在Java中有六种状态:

NEW(初始状态) 当一个线程对象被创建但尚未调用start()方法时,它处于初始状态。

RUNNABLE(运行状态)线程调用start()方法后进入就绪状态,等待CPU调度,当获得CPU时间片后,进入运行中状态。运行状态还包括就绪(ready)和运行中(running)两种状态。

BLOCKED(阻塞状态) 当现成视图进入一个被其他线程占用的同步代码块或方法时,它进入阻塞状态,等待锁的释放。

WAITING(等待状态) 线程进入等待黄铜,需要 等待其他线程显式唤醒。调用Object.wait()、Thread.join()或者LockSupport.park()方法会使线程进入等待状态。

TIMED_WAITING(超时等待状态)调用Thread.sleep(1000),Object.wait(1000)等方法会使线程进入超时等待状态。

TERMINATED(终止状态)当任务执行完毕后就进入终止状态

3、ThradLocalMap中的key为何要设计成弱引用

Sun 公司(现 Oracle)在 JDK 源码中将 ThreadLocalMap 的 Key(即 ThreadLocal 实例)设计为弱引用,主要是出于防御性设计的考虑,旨在解决在特定场景下(尤其是线程池)极易发生的 Key 内存泄漏问题。

具体原因可以从以下两个维度的对比来理解:

1. 假设 Key 使用强引用(会导致 Key 泄漏)

如果 ThreadLocalMap 内部的 Entry 对 ThreadLocal 实例持有强引用,当我们在业务代码中不再需要该 ThreadLocal 变量,并将其置为 null 时,由于当前线程(如线程池中的核心线程)依然存活,ThreadLocalMap 依然持有该 Entry。

此时,Entry 强引用着 ThreadLocal 实例,导致垃圾回收器(GC)无法回收它。只要线程不结束,这个 ThreadLocal 对象就会一直驻留在堆内存中,造成严重的内存泄漏。

2. 采用弱引用(JDK 设计者的“妥协”与“智慧”)

为了打破上述强引用链,JDK 引入了弱引用(WeakReference)机制:

弱引用的特性:只具有弱引用的对象,在下一次 GC 发生时,无论当前内存空间是否充足,都会被直接回收。

设计效果:当外部业务代码不再持有 ThreadLocal 的强引用时,ThreadLocalMap 中的 Key 会在 GC 时被自动回收,变成 null。这从根本上保证了 ThreadLocal 对象本身能够被及时回收,避免了 Key 层的内存泄漏。

4、线程池如何预热核心线程

可以使用ThreadPoolExecutor的prestartCoreThread或prestartAllCoreThreads方法预热核心线程。这样

线程池默认是惰性创建线程的,在需要及时响应的场景下提前预热可加快任务的处理,从而缩短响应时间。

5、如果需要将100个元素一次性高效写入HashMap中,该如何做

HashMap默认的初始化容量是16,扩容因子是0.75,扩容数是2的幂次,要使HashMap初始化后可以容纳100个元素不进行扩容,需在创建HashMap中将初始化容量设计为100/0.75+1,或者直接写256,因为HashMap底层会将129-255之间的数字改写为256

6、MVCC是什么,在哪里用到

MVCC(Multi-Version Concurrency Control)是多版本并发控制的英文简写,是一种用于提高数据库并发性能的机制,通过维护数据的多个版本来实现事物的隔离性,允许读写操作同时进行,从而提高数据库的并发性能和响应能力。

MVCC的基本原理

MVCC通过为每行数据维护多个版本来工作,每个版本都有自己的创建时间和事务ID。当一个事务需要读取数据时,它会读取对应版本的数据,而不是最新的数据。MVCC避免了使用传统的锁机制来管理数据的并发访问,减少了锁竞争,从而提升了系统的吞吐量和响应时间。

MVCC的实现基于undolog版本链readview

隐式字段

在MySQL存储的数据中,除了显式定义的字段,MySQL会隐含地定义几个字段:

trx_id:事务ID,每进行一次事务操作,就会自增1。

roll_pointer:回滚指针,用于找到上一个版本的数据,结合undolog进行回滚。

ReadView

ReadView是事务进行快照读操作时生成的读视图,用于判断版本链中的哪个版本对当前事务是可见的。在RC隔离级别下,每个快照读都会生成并获取最新的ReadView;在RR隔离级别下,只有在同一个事务的第一个快照读才会创建ReadView,之后的每次快照读都使用同一个ReadView。

版本链

对于每次更新操作,旧值会被保存到一条undolog中,形成版本链。版本链的头节点代表当前记录的最新值,每个版本还包含生成该版本的事务ID。

7、有哪些容器是并发安全的

Vector java 1.0中加入的线程安全的动态数组,性能低

Hashtable java早期的map,性能低

ConcurrentHashMap,HashMap的线程安全版

CopyOnWriteArrayList,ArrayList的线程安全版

ConcurrentLinkedQueue,LinkedList的线程安全版

BlockingQueue,阻塞队列

ConcurrentSkipListMap,TreeMao的线程安全版

http://www.jsqmd.com/news/954025/

相关文章:

  • 手把手教你用Python解析Hex文件:自己写个简易烧录器脚本
  • 3步解锁CPU性能:Universal x86 Tuning Utility终极硬件优化指南
  • 2026年最新巴中市黄金回收白银回收铂金回收彩金回收TOP5靠谱门店甄选 识店+辨价+安全交易指南及联系方式推荐 - 前途无量YY
  • NLP情报简报:工程师的技术雷达与落地避坑指南
  • MuleSoft企业级AI编排:LLM与ERP/CRM安全集成实战
  • Python包管理实战:PyPI、pip与虚拟环境全解析
  • 苏州传统零售私域直播系统怎么选?我会先看门店能不能接得住
  • 响应面驱动的复杂黑箱模型优化算法【附代码】
  • 实战应用:在快马ai中设计并仿真mos管h桥电机驱动电路
  • Agent Runtime 范式革命:会话即持久化事件日志
  • 原创:S905L/L3麻雀云arm通刷固件,已经测试UNT402A CM211-1通过
  • 2026年最新白城市黄金回收白银回收铂金回收彩金回收TOP5靠谱门店甄选 识店+辨价+安全交易指南及联系方式推荐 - 前途无量YY
  • 手机号定位神器:3秒查询陌生来电归属地,地图精准定位位置终极指南
  • Vision Transformer核心原理与PyTorch手撕实现
  • 探果AI(Tengo AI)办公AI实战:5分钟搞定复杂环境,避坑指南在此
  • Anthropic API架构变革:上下文编排层归零与客户端适配指南
  • 2026年最新白山市黄金回收白银回收铂金回收彩金回收TOP5靠谱门店甄选 识店+辨价+安全交易指南及联系方式推荐 - 前途无量YY
  • Claude 提示缓存机制深度解析:自动缓存、显式断点与 20 块回顾窗口
  • 零代码YouTube数据自动化:Google Sheets+Tableau可视化方案
  • Umi-OCR终极指南:免费开源离线文字识别软件,3分钟快速上手
  • 别再乱搜了!ESP8266-01S AT固件烧录,安信可官方固件+Flash下载工具最稳配置分享
  • 2026年最新白银市黄金回收白银回收铂金回收彩金回收TOP5靠谱门店甄选 识店+辨价+安全交易指南及联系方式推荐 - 前途无量YY
  • 毕业论文开题全攻略:从选题焦虑到顺利通关的实战经验
  • 手机号定位神器:3秒查询号码归属地,地图精准定位位置
  • 在macos python中安装dlib
  • 2026年泰州装修公司|泰州装修设计公司实力排行 - 奔跑123
  • Python if-else 不是语法糖,而是工程级决策引擎
  • LangChain+OpenAI构建技术文档精准问答系统
  • 软件协议整理
  • DBC文件避坑指南:从通讯协议到CANdb++编辑,手把手教你检查信号起始位与Value Table