首页 > 编程语言 >Java面试之多线程&并发篇

Java面试之多线程&并发篇

时间:2024-11-11 22:31:51浏览次数:1  
标签:语句 Java 并发 线程 notify volatile 多线程 sleep wait

前言

本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!如何停止一个正在运行的线程?notify()和notifyAll()有什么区别?sleep()和wait() 有什么区别?volatile 是什么?可以保证有序性吗?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘

*** 12万字的java面试题整理 ***

如何停止一个正在运行的线程

  1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
  2. 使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法。
  3. 使用interrupt方法中断线程。
class MyThread extends Thread {
   volatile boolean stop = false;
    public void run() {
         while (!stop) {
                System.out.println(getName() + " is running");
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println("week up from blcok...");
                    stop = true; // 在异常处理代码中修改共享变量的状态
              }
         }
        System.out.println(getName() + " is exiting...");
  }
}
class InterruptThreadDemo3 {
          public static void main(String[] args) throws InterruptedException {
                    MyThread m1 = new MyThread();
                    System.out.println("Starting thread...");
                    m1.start();
                    Thread.sleep(3000);
                    System.out.println("Interrupt thread...: " + m1.getName());
                    m1.stop = true; // 设置共享变量为true
                    m1.interrupt(); // 阻塞时退出阻塞状态
                    Thread.sleep(3000); // 主线程休眠3秒以便观察线程m1的中断情况
                    System.out.println("Stopping application...");
      }
}

notify()和notifyAll()有什么区别?

notify可能会导致死锁,而notifyAll则不会

任何时候只有一个线程可以获得锁,也就是说只有一个线程可以运行synchronized 中的代码
使用notifyall,可以唤醒 所有处于wait状态的线程,使其重新进入锁的争夺队列中,而notify只能唤醒一个。

wait() 应配合while循环使用,不应使用if,务必在wait()调用前后都检查条件,如果不满足,必须调用notify()唤醒另外的线程来处理,自己继续wait()直至条件满足再往下执行。

notify() 是对notifyAll()的一个优化,但它有很精确的应用场景,并且要求正确使用。不然可能导致死锁。正确的场景应该是 WaitSet中等待的是相同的条件,唤醒任一个都能正确处理接下来的事项,如果唤醒的线程无法正确处理,务必确保继续notify()下一个线程,并且自身需要重新回到WaitSet中.

sleep()和wait() 有什么区别?

对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。

sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。

当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备,获取对象锁进入运行状态。

volatile 是什么?可以保证有序性吗?

一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的,volatile关键字会强制将修改的值立即写入主存。
2)禁止进行指令重排序。
volatile 不是原子性操作
什么叫保证部分有序性?
当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行;

x = 2; //语句1
y = 0; //语句2
flag = true; //语句3
x = 4; //语句4y = -1; //语句5

由于flag变量为volatile变量,那么在进行指令重排序的过程的时候,不会将语句3放到语句1、语句2前面,也不会讲语句3放到语句4、语句5后面。但是要注意语句1和语句2的顺序、语句4和语句5的顺序是不作任何保证的。
使用volatile 一般用于 状态标记量 和 单例模式的双检锁。

标签:语句,Java,并发,线程,notify,volatile,多线程,sleep,wait
From: https://www.cnblogs.com/xswz/p/18540722

相关文章

  • 深入理解Java线程池:线程任务完成检测的原理与实现
    在Java中,线程池(ThreadPool)是用于管理和复用线程的机制,通过它可以高效地管理多线程任务。一个常见的问题是:线程池是如何知道某个线程的任务已经完成的?本篇文章将深入探讨线程池任务完成的检测原理,并结合代码示例,让大家深入理解线程池的工作方式。推荐正在找工作的朋友们:就......
  • Java Lambda表达式与函数式接口和Stream API的常用方法
    JavaLambda表达式常与函数式接口和流(StreamAPI)一起使用,提供了非常强大的方式来处理集合和其他数据结构。以下是一些常用的Lambda表达式方法和它们的用途,特别是在结合java.util.stream.Stream时:1.map()用途:用于将流中的每个元素转换成另一种形式。示例:List<String>name......
  • Java中包装类型和基本类型的区别:深入理解与应用
    Java中包装类型和基本类型的区别:深入理解与应用引言在Java编程中,基本类型(PrimitiveTypes)和包装类型(WrapperTypes)是两种不同的数据类型。基本类型是Java语言的核心部分,而包装类型则是为了提供更多的功能和灵活性。本文将深入探讨Java中包装类型和基本类型的区别,帮助你更......
  • 深入理解Java动态代理:原理、实现与应用
    深入理解Java动态代理:原理、实现与应用在现代软件开发中,面向对象编程(OOP)和面向切面编程(AOP)是两种重要的编程范式。Java语言中的动态代理(DynamicProxy)是实现AOP的关键技术之一,它允许我们在运行时创建一个代理对象,该代理对象可以拦截对真实对象方法的调用,并在方法调用前......
  • Java 8 Optional:用法和问题与解决示范
    1.引言Java8引入了Optional类来解决传统空指针异常(NullPointerException)的问题。Optional是一个容器类,专门用于表示可能包含或不包含非空值的对象。本文将深入探讨Optional的常见用法、常见问题及其解决方案,以及在实际项目中如何利用Optional优化代码结构,提高代......
  • 基于Java+SpringBoot+Mysql在线课程学习教育系统功能设计与实现三
    一、前言介绍:[免费获取]1.1项目摘要随着信息技术的飞速发展和互联网的普及,教育领域正经历着深刻的变革。传统的面对面教学模式逐渐受到挑战,而在线课程学习教育系统作为一种新兴的教育形式,正逐渐受到广泛关注和应用。在线课程学习教育系统的出现,不仅为学生提供了更加灵活、便......
  • Java实现常用加密算法-SM4
    参考博客:https://blog.csdn.net/m0_46713218/article/details/143099878参考博客:sm4前后端加密集成pom:<!--SM4加密依赖包--><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk18on</artifactId><version>1.......
  • 基于Java+SpringBoot+Mysql在线课程学习教育系统功能设计与实现四
    一、前言介绍:免费获取:猿来入此1.1项目摘要随着信息技术的飞速发展和互联网的普及,教育领域正经历着深刻的变革。传统的面对面教学模式逐渐受到挑战,而在线课程学习教育系统作为一种新兴的教育形式,正逐渐受到广泛关注和应用。在线课程学习教育系统的出现,不仅为学生提供了更加灵......
  • Java毕设项目案例实战II基于Java+Spring Boot+MySQL的狱内罪犯危险性评估系统设计与实
    目录一、前言二、技术介绍三、系统实现四、核心代码五、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。一、前言在司法体系中,狱内罪犯的危险性评估是确保监狱安全、提升管理效率的关键环节。传统......
  • 【JAVA基础】JAVA中是值传递还是引用传递?
    JAVA中是值传递还是引用传递?基本数据类型的值传递引用类型的值传递在Java中,参数传递实际上是通过值传递(pass-by-value)来实现的,但这一点在理解时可能会因为对象的存在而显得有些复杂。为了详细解释这一点,我们需要区分基本数据类型(如int,char,boolean等)和引用类型(如......