news 2026/5/5 6:18:49

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/5/5 0:55:11

写作小白救星!8个AI论文网站深度测评,本科生毕业论文必备神器

写作小白救星&#xff01;8个AI论文网站深度测评&#xff0c;本科生毕业论文必备神器 在当前学术研究日益数字化的背景下&#xff0c;本科生在撰写毕业论文时常常面临选题困难、资料查找繁琐、格式规范不熟悉等问题。尤其是对写作经验不足的学生来说&#xff0c;如何高效完成高…

作者头像 李华
网站建设 2026/5/5 0:55:31

借助AI的智能分析能力,开题报告的内容优化变得更加科学合理

工具对比速览 工具名称 核心功能 适用场景 效率评分 特色优势 AIBiYe 开题报告生成/降重 中文论文全流程 ★★★★★ 国内院校适配度高 AICheck 初稿生成/格式检查 快速产出框架 ★★★★☆ 结构化输出优秀 AskPaper 文献综述辅助 外文文献处理 ★★★★ 跨…

作者头像 李华
网站建设 2026/4/18 15:15:10

用优化算法提升BP神经网络分类预测性能

鹈鹕优化算法(POA)优化BP神经网络(BP)分类预测&#xff0c;代码包括POA-BP和基础BP的对比——可改为其他优化算法&#xff0c;如SSA,GEO,WOA,SMA等。 POA算法为2022年最新算法 模型评价指标包括:准确率和混淆图等&#xff0c;代码质量极高&#xff0c;方便学习和替换数据。 在机…

作者头像 李华
网站建设 2026/5/1 8:03:30

AI效率工具指南:10款热门应用免费版VS付费版功能测评

&#xfffd;&#xfffd; 10大降AIGC平台核心对比速览 排名 工具名称 降AIGC效率 适用场景 免费/付费 1 askpaper ⭐⭐⭐⭐⭐ 学术论文精准降AI 付费 2 秒篇 ⭐⭐⭐⭐⭐ 快速降AIGC降重 付费 3 Aibiye ⭐⭐⭐⭐ 多学科论文降AI 付费 4 Aicheck ⭐⭐⭐⭐…

作者头像 李华