2026/5/21 13:03:10
网站建设
项目流程
企业没有专业人员怎么建设网站,东莞新闻营销,网络架构规划,wordpress 加载面试官#xff1a;Java多线程和JUC你懂吗#xff1f;谢飞机#xff1a;我飞过#xff01;——互联网大厂技术面试搞笑实录#xff08;一#xff09;
场景#xff1a;某互联网大厂会议室#xff0c;阳光明媚但气氛紧张。面试官面无表情地翻着简历#xff0c;对面坐着一…面试官Java多线程和JUC你懂吗谢飞机我飞过——互联网大厂技术面试搞笑实录一场景某互联网大厂会议室阳光明媚但气氛紧张。面试官面无表情地翻着简历对面坐着一位自称“精通全栈”的求职者——谢飞机。第一轮提问Java 多线程基础面试官谢飞机是吧我看你简历写了“熟悉Java多线程编程”那你先说说Thread和Runnable有什么区别谢飞机这个我知道Thread是类Runnable是接口而且 Java 不支持多继承所以用Runnable更好面试官微微点头不错理解到位。那你说说为什么推荐使用线程池而不是手动创建线程谢飞机因为……new Thread() 太费内存了就像买手机不能每次打电话都买个新手机吧得租线程池就是租赁公司面试官嘴角微扬比喻有点意思。那你知道ExecutorService怎么关闭吗谢飞机当然调用shutdown()就行它会等任务执行完再关。还有个shutdownNow()那是直接拔电源面试官还行。那如果我想让主线程等待所有子线程完成后再继续怎么做谢飞机用join()啊或者CountDownLatch我还会用CyclicBarrier呢面试官嗯基本功可以。第二轮提问JUC 并发工具进阶面试官既然提到CountDownLatch说说它和CyclicBarrier的区别谢飞机呃……都是倒数计数器一个是从10减到0一个是反过来加面试官……谢飞机哦不对CountDownLatch是一个线程等其他多个线程完成CyclicBarrier是多个线程互相等大家一起出发像百米赛跑面试官勉强及格。那Semaphore呢用来做什么谢飞机信号灯控制并发数量的比如停车场有10个车位Semaphore(10)进来一辆车 acquire()出去 release()面试官例子不错。那ReentrantLock和synchronized有啥区别谢飞机都能加锁但ReentrantLock更高级可以尝试锁、可中断、还能指定公平锁面试官那它是怎么实现可重入的谢飞机呃……内部有个计数器谁持有锁就记名字具体我忘了反正能重入面试官皱眉行吧……第三轮提问线程安全与实战场景面试官现在有一个高并发场景多个线程同时对一个共享变量进行累加操作你会怎么处理谢飞机用volatile面试官volatile能保证原子性吗谢飞机呃……能不能好像不能……那用synchronized块包起来面试官还有别的办法吗谢飞机用AtomicIntegerCAS机制无锁并发面试官那 CAS 有什么缺点谢飞机ABA问题还有自旋太耗CPU面试官怎么解决 ABA谢飞机呃……加版本号AtomicStampedReference面试官不错。最后一个问题线程池的核心参数有哪些谢飞机corePoolSize、maximumPoolSize、workQueue、keepAliveTime、threadFactory、handler……面试官如果队列满了且线程数达到最大会发生什么谢飞机看拒绝策略默认是 AbortPolicy抛异常还可以自己定义面试官好今天的面试就到这里。你的基础还行有些地方需要加强。回去等通知吧。谢飞机起身鞠躬谢谢面试官我回去就把 JUC 源码打印出来当被子盖参考答案详解1. Thread 和 Runnable 的区别Thread是类Runnable是接口。Java 单继承限制下实现Runnable更灵活。实际上Thread类也实现了Runnable接口。推荐使用Runnable或Callable配合线程池使用。2. 为什么使用线程池避免频繁创建/销毁线程带来的资源消耗。控制并发数量防止资源耗尽。提供统一的管理机制监控、统计、拒绝策略等。3. ExecutorService 关闭方式shutdown()温和关闭不再接收新任务等待已提交任务执行完毕。shutdownNow()立即关闭尝试中断正在运行的线程返回未执行的任务列表。4. 主线程等待子线程thread.join()适用于少量线程。CountDownLatch适合一个或多个线程等待其他多个线程完成。CyclicBarrier多个线程相互等待达到屏障点后一起继续。Phaser更灵活的同步工具支持动态注册。5. CountDownLatch vs CyclicBarrier| 对比项 | CountDownLatch | CyclicBarrier | |--------|----------------|---------------| | 计数方向 | 向下减少 | 达到数量即触发 | | 是否可重用 | 不可重用 | 可重用reset | | 使用场景 | 主线程等待多个任务完成 | 多个线程互相等待 | | 实现机制 | 计数为0唤醒 | 达到阈值触发 |6. Semaphore 作用用于控制同时访问特定资源的线程数量。常用于限流、资源池如数据库连接池。acquire()获取许可release()释放许可。7. ReentrantLock vs synchronized| 特性 | synchronized | ReentrantLock | |------|--------------|---------------| | 语法级别 | JVM 层面关键字 | API 层面代码调用 | | 可中断 | 否 | 是lockInterruptibly | | 超时获取 | 否 | 是tryLock(timeout) | | 公平性 | 非公平 | 可设置公平锁 | | 条件变量 | wait/notify | Condition |8. ReentrantLock 实现可重入原理内部使用AQSAbstractQueuedSynchronizer实现。维护一个 state 变量表示锁状态thread 记录持有锁的线程。同一线程重复获取锁时state释放时 state--直到为0才真正释放。9. 共享变量并发累加解决方案synchronized同步块ReentrantLock显式锁AtomicInteger等原子类基于 CAS volatileLongAdder高并发下性能更好10. CAS 缺点ABA问题值从A→B→ACAS 无法察觉中间变化。解决方案AtomicStampedReference加版本号。自旋开销循环重试可能导致 CPU 空转。可通过Thread.yield()优化。只能保证单个变量的原子性多变量需使用锁或其他机制。11. 线程池核心参数corePoolSize核心线程数maximumPoolSize最大线程数keepAliveTime非核心线程空闲存活时间unit时间单位workQueue任务队列threadFactory线程工厂handler拒绝策略12. 拒绝策略AbortPolicy抛出RejectedExecutionExceptionCallerRunsPolicy由提交任务的线程执行DiscardPolicy静默丢弃DiscardOldestPolicy丢弃队列中最老的任务重试提交