版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年高频java多线程并发面试题及答案线程与进程的本质区别是什么?进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位。一个进程可包含多个线程,共享进程的堆和方法区资源,但每个线程有独立的程序计数器、虚拟机栈和本地方法栈。进程间通信需通过IPC(管道、消息队列、套接字等),线程间通信更轻量,可直接访问共享变量。调用start()和直接调用run()方法的区别是什么?start()方法属于Thread类,会启动新线程并调用run()方法,遵循JVM的线程调度机制。直接调用run()方法等同于在当前线程执行普通方法调用,不会创建新线程。例如,执行newThread(()->{}).start()会创建新线程并异步执行任务,而直接调用run()则在主线程同步执行。线程的生命周期包含哪些状态?Java中线程状态由Thread.State枚举定义,共6种:NEW(新建,未调用start())、RUNNABLE(可运行,包括操作系统的运行中或就绪状态)、BLOCKED(阻塞,等待监视器锁)、WAITING(无限等待,需其他线程唤醒)、TIMED_WAITING(超时等待,指定时间后自动唤醒)、TERMINATED(终止,执行完毕或异常退出)。状态转换典型路径:NEW→RUNNABLE(start())→BLOCKED(获取synchronized锁失败)→RUNNABLE(获取锁成功)→WAITING(调用wait())→RUNNABLE(被notify()唤醒)→TERMINATED(run()结束)。synchronized关键字的底层实现原理是什么?JDK1.6前synchronized是重量级锁,依赖操作系统的互斥量(MutexLock),涉及用户态到内核态的切换,性能较低。JDK1.6引入锁优化机制,包括偏向锁、轻量级锁、自旋锁、适应性自旋、锁消除、锁粗化。对象头中的MarkWord存储锁状态,无锁状态时存储对象哈希码和GC分代年龄;偏向锁会记录第一个获取锁的线程ID,后续该线程再次获取锁无需CAS操作;若有其他线程竞争,升级为轻量级锁(通过CAS将MarkWord指向当前线程栈中的锁记录);若竞争激烈,升级为重量级锁(依赖Monitor对象,MonitorEnter和MonitorExit字节码指令实现)。volatile的作用和底层实现是什么?volatile保证变量的可见性(修改后立即刷新到主内存,其他线程读取时从主内存获取最新值)和有序性(禁止指令重排序),但不保证原子性。底层通过内存屏障(MemoryBarrier)实现:写volatile变量时,在写操作后插入StoreStore屏障(保证前面的写操作先于volatile写完成)和StoreLoad屏障(防止volatile写与后续读操作重排序);读volatile变量时,在读操作前插入LoadLoad屏障(防止后续读操作与volatile读重排序)和LoadStore屏障(防止后续写操作与volatile读重排序)。典型应用场景:状态标志(如volatilebooleanrunning)、双重检查锁定(DCL)中的单例对象。AtomicInteger如何保证原子性?基于CAS(Compare-And-Swap)操作,底层通过Unsafe类的compareAndSwapInt方法实现。CAS包含三个操作数:内存位置(V)、预期原值(A)、新值(B),仅当V等于A时,才将V更新为B,否则重试。AtomicInteger的incrementAndGet()方法调用unsafe.getAndAddInt(this,valueOffset,1)+1,其中valueOffset是变量在内存中的偏移量。CAS存在ABA问题(变量从A→B→A,虽值未变但中间可能有其他操作),可通过AtomicStampedReference(记录版本号)或AtomicMarkableReference(记录标记)解决。线程池的核心参数有哪些?ThreadPoolExecutor构造函数包含7个参数:corePoolSize(核心线程数,即使空闲也保留)、maximumPoolSize(最大线程数)、keepAliveTime(非核心线程空闲存活时间)、unit(时间单位)、workQueue(任务队列,如ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue)、threadFactory(线程工厂,用于创建线程)、rejectedExecutionHandler(拒绝策略,任务无法提交时的处理方式)。工作流程:提交任务→若当前线程数<corePoolSize,创建新线程执行;否则将任务加入队列;若队列满且线程数<maximumPoolSize,创建新线程执行;若队列满且线程数≥maximumPoolSize,触发拒绝策略。常见的线程池拒绝策略有哪些?JDK提供4种内置策略:AbortPolicy(默认,抛出RejectedExecutionException)、CallerRunsPolicy(调用者线程执行任务)、DiscardPolicy(静默丢弃任务)、DiscardOldestPolicy(丢弃队列中最旧任务,尝试重新提交当前任务)。实际开发中可自定义策略(如记录日志后重试)。如何合理配置线程池参数?需结合任务类型(CPU密集型、IO密集型)和系统资源(CPU核心数、内存)。CPU密集型任务(如复杂计算):核心线程数建议设为CPU核心数+1(避免上下文切换);IO密集型任务(如数据库访问、网络请求):核心线程数可设为CPU核心数×2或根据IO等待时间调整(公式:核心数×(1+IO耗时/CPU耗时))。队列选择:若任务执行时间短且吞吐量要求高,选SynchronousQueue(无界但直接提交);若任务量可控且需缓冲,选ArrayBlockingQueue(有界防止OOM);若任务优先级不同,选PriorityBlockingQueue(按优先级排序)。CountDownLatch和CyclicBarrier的区别是什么?CountDownLatch是减计数器(构造时指定计数,await()等待计数到0),只能使用一次;CyclicBarrier是增计数器(构造时指定等待线程数,await()阻塞直到达到该数目),可通过reset()重置重复使用。应用场景:CountDownLatch用于主线程等待多个子线程完成(如多线程并行计算后汇总);CyclicBarrier用于多个子线程相互等待(如多阶段任务,需所有线程完成当前阶段后再进入下一阶段)。Semaphore的作用和使用场景是什么?Semaphore(信号量)用于控制同时访问特定资源的线程数量,通过acquire()获取许可,release()释放许可。构造时指定初始许可数。典型场景:资源池(如数据库连接池限制最大连接数)、限流(控制接口并发请求量)。例如,限制同时只能有5个线程访问某方法:Semaphoresemaphore=newSemaphore(5);线程中调用semaphore.acquire(),执行完调用semaphore.release()。ConcurrentHashMap在JDK1.7和JDK1.8中的实现差异?JDK1.7采用分段锁(Segment数组+HashEntry数组),每个Segment独立加锁,默认16个Segment,并发度为16。JDK1.8摒弃分段锁,采用CAS+synchronized实现,结构为Node数组+链表/红黑树(链表长度≥8且数组长度≥64时转红黑树)。synchronized仅锁定链表头节点(或红黑树根节点),减少锁粒度,并发度更高。put操作流程:计算哈希→遍历数组→若节点为空,CAS插入;若节点不为空,synchronized锁定该节点→遍历链表/红黑树插入或更新。ThreadLocal的作用和内存泄漏原因?ThreadLocal用于为每个线程提供独立的变量副本,解决多线程并发访问共享变量的线程安全问题。典型应用:数据库连接(每个线程独立持有Connection)、用户会话信息(如Spring的RequestContextHolder)。内存泄漏原因:ThreadLocal对象被设置为弱引用(WeakReference),若外部没有强引用指向ThreadLocal实例,GC时会被回收,但ThreadLocalMap中的Entry(key为弱引用的ThreadLocal,value为强引用的变量副本)的value可能无法被回收(因线程未终止,ThreadLocalMap的生命周期与线程一致),导致内存泄漏。解决方法:使用完ThreadLocal后调用remove()方法清除Entry,或在线程池场景中(线程复用)及时清理。AQS(AbstractQueuedSynchronizer)的核心原理?AQS是JUC中锁和同步工具的基础(如ReentrantLock、CountDownLatch),通过维护一个volatileintstate(同步状态)和一个FIFO等待队列(CLH队列的变种)实现。子类需重写tryAcquire(int)、tryRelease(int)(独占模式)或tryAcquireShared(int)、tryReleaseShared(int)(共享模式)来管理state。获取锁时,若state允许(如ReentrantLock的state=0表示未锁定),则CAS更新state并设置当前线程为独占线程;否则将线程封装为Node加入队列,通过park()阻塞。释放锁时,更新state并unpark()队列中的后继节点。死锁的必要条件及解决方法?死锁发生需满足四个条件:互斥(资源同一时间只能被一个线程占用)、请求与保持(线程已持有资源并请求其他资源)、不可抢占(资源只能由持有者主动释放)、循环等待(线程A等线程B的资源,线程B等线程A的资源)。解决方法:破坏任一条件。破坏互斥(如使用可共享资源,但多数资源需互斥);破坏请求与保持(一次性申请所有资源);破坏不可抢占(设置超时,超时后释放已占资源);破坏循环等待(按固定顺序申请资源)。检测工具:jconsole、jstack(查看线程dump中的lockedmutex信息)。synchronized和Lock的区别?synchronized是关键字,JVM层面实现,自动释放锁(同步块/方法执行完或异常时);Lock是接口(如ReentrantLock),需手动调用unlock()释放(通常在finally块中)。synchronized不可中断(除非抛出异常),Lock的lockInterruptibly()支持中断;synchronized是非公平锁(JDK1.6后偏向锁优化可偏向第一个获取锁的线程),Lock默认非公平但可构造时指定为公平锁;synchronized无等待超时机制,Lock的tryLock(longtimeout,TimeUnitunit)支持超时获取锁;Lock支持多个条件变量(Condition),可更精细控制线程唤醒(如生产者-消费者模型中区分生产者和消费者的等待队列)。如何实现一个线程安全的单例模式?双重检查锁定(DCL)是常用方法,需配合volatile关键字防止指令重排序。示例:publicclassSingleton{privatestaticvolatileSingletoninstance;//volatile防止instance=newSingleton()的指令重排序privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){//第一次检查,减少锁竞争synchronized(Singleton.class){if(instance==null){//第二次检查,防止多线程同时通过第一次检查后重复创建instance=newSingleton();}}}returninstance;}}原理:volatile保证instance的可见性和有序性(禁止"分配内存→引用赋值→初始化对象"中的"引用赋值"和"初始化对象"重排序),避免其他线程获取到未完全初始化的实例。多线程环境下如何保证数据一致性?需结合原子性、可见性、有序性。原子性通过synchronized、Lock或原子类(AtomicXXX)保证;可见性通过volatile、synchronized(解锁前刷新主内存,加锁时读取主内存)、Lock(释放锁前刷新,获取锁时读取)保证;有序性通过volatile(内存屏障)、synchronized(同一锁的同步块内指令有序)、happens-before规则保证。例如,转账操作需保证原子性(synchronized同步方法)、可见性(volatile标记账户余额)、有序性(避免指令重排导致的中间状态可见)。线程池异常处理方式有哪些?任务抛出未捕获异常时,默认由线程的UncaughtExceptionHandler处理(线程工厂创建线程时可设置)。具体方式:1.在Runnable/Callable任务内部用try-catch捕获异常并处理;2.重写ThreadPoolExecutor的afterExecute(Runnabler,Throwablet)方法(t为任务执行时的异常,仅Runnable任务的异常会被包装为RuntimeException,Callable的异常会被包装为ExecutionException);3.为线程池中的线程设置UncaughtExceptionHandler(通过ThreadFactory在创建线程时设置)。CAS的缺点及解决方案?缺点:1.循环时间长开销大(自旋CAS若长时间不成功,会导致CPU空转);2.只能保证单个变量的原子操作(对多个变量需使用锁或AtomicReference);3.ABA问题(变量值经过A→B→A的变化,CAS认为无变化但实际有操作)。解决方案:针对自旋开销,JVM会进行适应性自旋(根据前一次自旋结果调整次数);针对多变量,使用AtomicReference或锁;针对ABA问题,使用带版本号的AtomicStampedReference(每次修改版本号+1,CAS时检查版本号)。Java内存模型(JMM)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中国联合网络通信有限公司研究院招聘备考题库完整答案详解
- 废铁压块承揽合同范本
- 新疆民宿管理制度规范
- 规范机构编制管理制度
- 支付货款流程规范制度
- 直播拍摄制度规范标准
- 肉类工厂制度规范标准
- 消防维保制度国标规范
- 检察院规范上下班制度
- 行吊作业安全制度规范
- 教育机构安全生产举报奖励制度
- 妊娠合并胆汁淤积综合征
- GB/T 4706.11-2024家用和类似用途电器的安全第11部分:快热式热水器的特殊要求
- FZ∕T 61002-2019 化纤仿毛毛毯
- 《公输》课文文言知识点归纳
- 碎石技术供应保障方案
- 园林苗木容器育苗技术
- 23秋国家开放大学《机电一体化系统设计基础》形考作业1-3+专题报告参考答案
- 2023年工装夹具设计工程师年终总结及下一年计划
- 第七章腭裂课件
- 儿科学热性惊厥课件
评论
0/150
提交评论