news 2026/9/20 10:52:56

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/9/8 22:07:53

导师严选8个降AI率平台,千笔·专业降AI率智能体助你精准降AIGC

导师严选8个降AI率平台&#xff0c;千笔专业降AI率智能体助你精准降AIGC AI降重工具&#xff0c;助你轻松应对论文挑战 在当前学术写作中&#xff0c;越来越多的学生开始借助AI工具提升写作效率。然而&#xff0c;随之而来的AIGC率问题也成为了论文通过审核的一大障碍。如何在保…

作者头像 李华
网站建设 2026/9/11 16:35:32

一个玩具webgl框架

自己学习了《webgl编程指南》&#xff0c;在学习的过程中就行了记录&#xff0c;您可以看到我在博客其实有大量的篇幅去记录。于是我把学到的进行一个总结。 于是这个玩具webgl的框架就出现了。如果您发现了问题&#xff0c;可以跟我说下。谢谢包容 如果你感兴趣&#xff0c;…

作者头像 李华
网站建设 2026/9/20 10:07:14

弱口令介绍及破解方式,一文详解!

一、弱口令的定义 仅包含简单数字和字母的口令&#xff0c;例如“123”、“abc”等&#xff0c;因为这样的口令很容易被别人破解&#xff0c;从而使用户的计算机面临风险&#xff0c;因此不推荐用户使用。 二、弱口令的特点 1、连续字符串&#xff08;如aaaa&#xff0c;abc…

作者头像 李华
网站建设 2026/9/13 18:48:04

零基础怎么如何学网络安全,一文带你零基础从入门到精通!

一、学习建议 1.了解基础概念&#xff1a; 开始之前&#xff0c;了解网络安全的基本概念和术语是很重要的。你可以查找网络安全入门教程或在线课程&#xff0c;了解网络安全领域的基本概念&#xff0c;如黑客、漏洞、攻击类型等。 2.网络基础知识&#xff1a; 学习计算机网…

作者头像 李华
网站建设 2026/9/17 17:57:19

基于51单片机的智能浇花系统

基于51单片机的智能浇花系统设计 一、设计背景与意义 家庭园艺、阳台种植已成为日常休闲的重要方式&#xff0c;但传统人工浇花存在浇水时机不精准、外出无人照料、水量控制不当等问题&#xff0c;易导致花卉缺水枯萎或积水烂根。现有智能浇花系统多依赖物联网平台与高端控制…

作者头像 李华