news 2026/6/10 13:23:04

Java面试必看:掌握线程同步与调度核心方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java面试必看:掌握线程同步与调度核心方法

文章目录

  • Java面试必看:掌握线程同步与调度核心方法?
    • 一、线程同步:为什么我们需要它?
      • 1.1 线程安全问题:一场“多线程的灾难”
        • 代码示例:线程不安全的计数器
      • 1.2 解决方案:同步机制
        • 1.2.1 synchronized关键字
          • 同步方法
          • 同步代码块
        • 1.2.2 ReentrantLock:更灵活的同步工具
          • 示例代码:
        • 1.2.3 选择合适的同步工具
    • 二、线程调度:如何让线程“有序”运行?
      • 2.1 线程的优先级:高优先级 ≠ 总是先执行
        • 示例代码:
      • 2.2 线程间的通信:wait()、notify()与notifyAll()
        • 示例代码:生产者-消费者问题
      • 2.3 CountDownLatch:让多个线程“齐步走”
        • 示例代码:
    • 三、总结
    • 通过合理使用这些机制,可以有效管理多线程程序的行为,避免常见的并发问题。
      • 📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

Java面试必看:掌握线程同步与调度核心方法?

大家好,我是闫工,今天又是一个阳光明媚的日子!不过,看到你正在为Java面试而头疼,闫工的心情也跟着阴沉了下来。别担心,闫工这就带着你踏上一场“线程同步与调度”的冒险之旅,保证让你在面试中大放异彩!


一、线程同步:为什么我们需要它?

1.1 线程安全问题:一场“多线程的灾难”

想象一下,你正在食堂打饭,多个同学同时排队买饭。如果没有秩序,大家可能会抢着拿同一个盘子,导致食物洒得到处都是。这就是典型的线程不安全问题!

在Java中,线程安全问题主要表现为竞态条件(Race Condition)内存可见性问题。比如,两个线程同时修改一个共享变量,结果可能丢失其中一个修改。

代码示例:线程不安全的计数器
publicclassUnsafeCounter{privateintcount=0;publicvoidincrement(){count++;}publicstaticvoidmain(String[]args){UnsafeCountercounter=newUnsafeCounter();Threadt1=newThread(()->{for(inti=0;i<1000;i++){counter.increment();}});Threadt2=newThread(()->{for(inti=0;i<1000;i++){counter.increment();}});t1.start();t2.start();try{t1.join();t2.join();}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("最终计数:"+counter.count);}}

运行这段代码,你会发现结果可能不是预期的2000。这是因为两个线程同时操作同一个变量,导致竞态条件

1.2 解决方案:同步机制

1.2.1 synchronized关键字

synchronized是Java中最常用的同步工具,可以保证同一时间只有一个线程执行被加锁的代码块。

同步方法
publicclassSafeCounter{privateintcount=0;publicsynchronizedvoidincrement(){// 同步方法count++;}}
同步代码块
publicclassSafeCounter2{privateintcount=0;privatefinalObjectlock=newObject();// 私有锁对象publicvoidincrement(){synchronized(lock){// 使用自定义锁count++;}}}
1.2.2 ReentrantLock:更灵活的同步工具

ReentrantLock提供了比synchronized更灵活的功能,比如可以中断锁等待、支持公平锁等。

示例代码:
importjava.util.concurrent.locks.ReentrantLock;publicclassSafeCounter3{privateintcount=0;privateReentrantLocklock=newReentrantLock();publicvoidincrement(){lock.lock();// 尝试获取锁try{count++;}finally{lock.unlock();// 释放锁}}}
1.2.3 选择合适的同步工具
  • 如果需要简单的同步,直接使用synchronized
  • 如果需要更灵活的功能(比如公平锁、超时等待),优先考虑ReentrantLock

二、线程调度:如何让线程“有序”运行?

2.1 线程的优先级:高优先级 ≠ 总是先执行

Java中,每个线程都有一个优先级(范围为1到10)。虽然高优先级的线程更有可能被优先调度,但具体行为还取决于JVM实现。

示例代码:
publicclassThreadPriorityDemo{publicstaticvoidmain(String[]args){Threadt1=newThread(()->{System.out.println("低优先级线程开始");for(inti=0;i<5;i++){System.out.println("Low thread: "+i);}System.out.println("低优先级线程结束");},"LowThread");Threadt2=newThread(()->{System.out.println("高优先级线程开始");for(inti=0;i<5;i++){System.out.println("High thread: "+i);}System.out.println("高优先级线程结束");},"HighThread");t1.setPriority(Thread.MIN_PRIORITY);// 设置最低优先级t2.setPriority(Thread.MAX_PRIORITY);// 设置最高优先级t1.start();t2.start();}}

运行这段代码,你会看到高优先级的线程可能先执行,但结果并不总是如此。

2.2 线程间的通信:wait()、notify()与notifyAll()

有时候,我们需要让一个线程等待另一个线程完成某些操作。这时候,wait()notify()方法就派上了用场。

示例代码:生产者-消费者问题
importjava.util.Queue;importjava.util.concurrent.ConcurrentLinkedQueue;publicclassProducerConsumer{privateQueue<String>queue=newConcurrentLinkedQueue<>();privatefinalObjectlock=newObject();publicvoidproduce(Stringitem){synchronized(lock){// 加锁while(queue.size()>=2){// 模拟队列满的情况try{System.out.println("队列已满,生产者等待...");lock.wait();// 等待消费者消费}catch(InterruptedExceptione){e.printStackTrace();}}queue.add(item);System.out.println("生产:"+item);lock.notifyAll();// 唤醒所有可能在等待的线程}}publicvoidconsume(){synchronized(lock){// 加锁while(queue.isEmpty()){// 模拟队列空的情况try{System.out.println("队列为空,消费者等待...");lock.wait();// 等待生产者生产}catch(InterruptedExceptione){e.printStackTrace();}}Stringitem=queue.poll();System.out.println("消费:"+item);lock.notifyAll();// 唤醒所有可能在等待的线程}}publicstaticvoidmain(String[]args){ProducerConsumerpc=newProducerConsumer();Threadproducer1=newThread(()->{for(inti=0;i<3;i++){pc.produce("Product "+i);}},"Producer1");Threadconsumer1=newThread(()->{for(inti=0;i<5;i++){pc.consume();}},"Consumer1");producer1.start();consumer1.start();}}

2.3 CountDownLatch:让多个线程“齐步走”

CountDownLatch允许一个或多个线程等待,直到其他指定的线程完成一系列操作。

示例代码:
importjava.util.concurrent.CountDownLatch;publicclassCountDownLatchDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{intthreadCount=3;CountDownLatchstartSignal=newCountDownLatch(1);// 所有线程等待开始信号CountDownLatchdoneSignal=newCountDownLatch(threadCount);// 主线程等待所有线程完成for(inti=0;i<threadCount;i++){Threadworker=newThread(()->{try{System.out.println("线程准备就绪...");startSignal.await();// 等待开始信号doWork();doneSignal.countDown();// 完成后通知主线程}catch(InterruptedExceptione){e.printStackTrace();}});worker.start();}System.out.println("所有线程准备完毕,即将开始...");startSignal.countDown();// 发送开始信号doneSignal.await();// 等待所有线程完成System.out.println("所有线程已完成任务");}privatestaticvoiddoWork(){System.out.println(Thread.currentThread().getName()+" 正在工作...");try{Thread.sleep(100);}catch(InterruptedExceptione){e.printStackTrace();}}}

三、总结

  • 同步工具:根据需求选择synchronizedReentrantLock等。
  • 线程调度:优先级只能作为参考,不能保证执行顺序。
  • 线程通信:使用wait()notify()实现线程间的等待与唤醒。
  • 复杂场景:考虑使用更高阶的同步工具类(如CountDownLatchCyclicBarrier等)。

通过合理使用这些机制,可以有效管理多线程程序的行为,避免常见的并发问题。

📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

成体系的面试题,无论你是大佬还是小白,都需要一套JAVA体系的面试题,我已经上岸了!你也想上岸吗?

闫工精心准备了程序准备面试?想系统提升技术实力?闫工精心整理了1000+ 套涵盖前端、后端、算法、数据库、操作系统、网络、设计模式等方向的面试真题 + 详细解析,并附赠高频考点总结、简历模板、面经合集等实用资料!

✅ 覆盖大厂高频题型
✅ 按知识点分类,查漏补缺超方便
✅ 持续更新,助你拿下心仪 Offer!

📥免费领取👉 点击这里获取资料

已帮助数千位开发者成功上岸,下一个就是你!✨

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 3:18:00

深度测评10个降AIGC平台 千笔AI帮你轻松降AI率

深度测评10个降AIGC平台 千笔AI帮你轻松降AI率 AI降重工具&#xff1a;让论文更自然&#xff0c;更安全 在当今学术写作中&#xff0c;越来越多的学生开始借助AI工具进行论文撰写。然而&#xff0c;随着各大高校对AIGC&#xff08;人工智能生成内容&#xff09;检测的重视&am…

作者头像 李华
网站建设 2026/6/10 11:12:19

基于MATLAB的二维医学图像分割方法的研究

基于MATLAB的二维医学图像分割方法的研究 第一章 绪论 二维医学图像分割是医学影像分析的核心环节&#xff0c;其目的是从CT、MRI、超声等影像中精准提取病灶、器官等目标区域&#xff0c;为疾病诊断、手术规划、疗效评估提供数据支撑。传统手工分割方式依赖医师经验&#xf…

作者头像 李华
网站建设 2026/6/10 11:09:14

【Linux命令大全】008.磁盘维护之mkisofs命令(实操篇)

【Linux命令大全】008.磁盘维护之mkisofs命令&#xff08;实操篇&#xff09; ✨ 本文为Linux系统磁盘维护命令的全面汇总与深度优化&#xff0c;结合图标、结构化排版与实用技巧&#xff0c;专为高级用户和系统管理员打造。 (关注不迷路哈&#xff01;&#xff01;&#xff01…

作者头像 李华
网站建设 2026/6/10 11:13:29

双非背景如何逆袭腾讯T8 AI产品经理offer?大模型求职实战经验全分享,建议收藏!

文章讲述了双非背景的数据产品经理如何通过针对性辅导获得腾讯T8 AI产品经理offer的案例。学员面临学历硬伤、认知断层和表达误区三大问题&#xff0c;通过项目镀金、方法论迁移和话术洗牌等策略提升竞争力。面试过程中需深入理解大模型技术、AI产品全生命周期管理及腾讯云智能…

作者头像 李华
网站建设 2026/6/10 11:57:19

34合1黑科技工具箱!大神整合的免费软件套装

下载链接 https://pan.freedw.com/s/nDCayj 今天给大家安利一个超级实用的黑科技工具箱&#xff0c;里面集成了34款超好用的小软件&#xff0c;全都是日常能用到的实用工具&#xff0c;重点是完全免费还没广告&#xff0c;真的太良心了&#xff01; 打开软件就能看到24个常用…

作者头像 李华
网站建设 2026/6/10 11:55:57

使用大模型

https://api.lingyaai.cn/注册 登录下 充值下 然后 添加令牌 输入名称就行提交 选择模型用就行了

作者头像 李华