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

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!

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

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

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

相关文章:

  • 2026年河南企业用工风险咨询机构推荐:专项测评与选型指南
  • 2025年热门4轴数控机床:这些门店品牌你不能错过,自动化数控机床/医疗器械数控机床,4轴数控机床厂家选哪家
  • 2026年北京瑜伽馆推荐:基于连锁规模与专业服务评价,直击品质与安全痛点
  • 基于51单片机智能语音门锁识别控制系统
  • 2026年北京瑜伽馆推荐:健康生活趋势评测,涵盖都市女性与品质生活场景核心痛点
  • 写作小白救星!8个AI论文网站深度测评,本科生毕业论文必备神器
  • 女式西装品牌如何选?2026年女式西装推荐与排名,解决风格固化与多功能痛点
  • 2026年北京瑜伽馆推荐:健康生活趋势排名,涵盖塑形与理疗场景核心痛点
  • 大润发超市购物卡回收注意事项与4大误区
  • 深度测评10个降AIGC平台 千笔AI帮你轻松降AI率
  • 无人机视角智慧交通道路路面减速带斑马线施工道路封闭检测识别分割数据集labelme格式537张4类别
  • 2026年手机膜工厂联系电话推荐:高效对接与合作指引
  • 杭州国涛电器有限公司联系方式:信息核实与沟通建议
  • 导师又让重写?9个AI论文平台测评:专科生毕业论文+科研写作必备工具
  • 为什么银行放着好好的Oracle不用,要建设Hadoop数仓?银行建设Hadoop数仓的核心需求分析。
  • 分析2026年潘家园配眼镜店排名,哪家品牌的配镜服务更靠谱
  • 分析乌鲁木齐高性价比的校史馆建设公司排名
  • 2026年杭州遗产继承纠纷律师推荐:婚姻律师/离婚律师 /刑事律师/ 劳动纠纷律师服务精选
  • 基于MATLAB的二维医学图像分割方法的研究
  • 基于MATLAB的IIR滤波器设计与仿真
  • 输入不同宣传方案的文案和点击量,自动分析文案爆款规律,生成文案创新技巧。
  • 众信旅游 联系方式: 获取官方信息的途径与建议
  • 2026年北京潘家园口碑好的眼镜店,潘家园眼镜店服务怎么联系
  • 盘点2026年廊坊可靠的全屋定制,亿方凡全屋定制怎么样
  • Bandizip免费下载安装教程:2026年最新解压软件下载指南(附专业版安装包,超详细)
  • 基于MATLAB GUI的信号与系统
  • 分析乌鲁木齐比较好的警史馆建设品牌企业,靠谱的有哪些?
  • 众信旅游 联系方式:官方服务渠道使用与风险提示
  • 相片合成GIF怎么弄?教你无损合成的正确方法
  • 基于matlab的焊缝边缘检测