首页 > 其他分享 >谈谈这几个常见的多线程面试题

谈谈这几个常见的多线程面试题

时间:2022-12-21 20:55:40浏览次数:35  
标签:面试题 同步 死锁 running 谈谈 线程 监视器 多线程 运行

创建线程有几种不同的方式?你喜欢哪一种?为什么?

有三种方式可以用来创建线程:

  • 继承Thread类

  • 实现Runnable接口

  • 应用程序可以使用Executor框架来创建线程池

实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。

概括的解释下线程的几种可用状态。

新建( new ):新创建了一个线程对象;

可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象的 start ()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取CPU的使用权;

运行( running ):可运行状态( runnable )的线程获得了CPU时间片( timeslice ) ,执行程序代码;

阻塞( block ):阻塞状态是指线程因为某种原因放弃了CPU 使用权,也即让出了 CPU timeslice ,暂时停止运行。直到线程进入可运行( runnable )状态,才有 机会再次获得 cpu timeslice 转到运行( running )状态。

阻塞的情况分三种:

  1. 等待阻塞:运行( running )的线程执行 o . wait ()方法, JVM 会把该线程放 入等待队列( waitting queue )中。

  2. 同步阻塞:运行( running )的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则 JVM 会把该线程放入锁池( lock pool )中。

  3. 其他阻塞: 运行( running )的线程执行 Thread . sleep ( long ms )或 t . join ()方法,或者发出了 I / O 请求时, JVM 会把该线程置为阻塞状态。当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程重新转入可运行( runnable )状态。

死亡( dead ):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该线程结束生命周期。死亡的线程不可再次复生。

同步方法和同步代码块的区别是什么?

区别:

  • 同步方法默认用this或者当前类class对象作为锁;

  • 同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法;

在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?

监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。

java 还提供了显式监视器( Lock )和隐式监视器( synchronized )两种锁方案。

什么是死锁(deadlock)?

两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是这些线程都陷入了无限的等待中。

如何确保N个线程可以访问N个资源同时又不导致死锁?

多线程产生死锁的四个必要条件:

  • 互斥条件:一个资源每次只能被一个进程使用。

  • 保持和请求条件:一个进程因请求资源而阻塞时,对已获得资源保持不放。

  • 不可剥夺性:进程已获得资源,在未使用完成前,不能被剥夺。

  • 循环等待条件(闭环):若干进程之间形成一种头尾相接的循环等待资源关系。

只要破坏其中任意一个条件,就可以避免死锁

一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。

标签:面试题,同步,死锁,running,谈谈,线程,监视器,多线程,运行
From: https://www.cnblogs.com/kisshappyboy/p/16997227.html

相关文章

  • Django重点及面试题
    Django简述python三大主流web框架"""django 大而全,类似于航空母舰 但是有时候过于笨重flask 小而精,类似于游骑兵(单行代码就可以起一个flask服务) 第三方组件很多,......
  • 内核多线程
    Linux内核多线程(一)Linux内核多线程(二)Linux内核多线程(三)Linux内核多线程(四)Linux内核多线程——补充(各种平台下的多线程) kernel_thread()和kthread_run()/kthread_cre......
  • 程序人生(一)从“道·法·术·器“”的角度来谈谈程序的境界
    目录​​一、器​​​​武术​​​​三国​​​​二、术​​​​武术​​​​三国​​​​三、法​​​​三国​​​​四、道​​​​武术​​​​三国​​​​总结​​作......
  • 谈谈流计算中的『Exactly Once』特性
    本文翻译自streaml.io网站上的一篇博文:“ExactlyonceisNOTexactlythesame”,分析了流计算系统中常说的『ExactlyOnce』特性,主要观点是:『精确一次』并不保证是完......
  • 多线程实践篇
    这篇文章有参考ue5源码和其他源码。多线程同步.h文件/** *关键段用户模式下同步对象,除非竞争非常激烈,否则不会进入内核模式 */ classSYSTEM_APIMCriticalSection......
  • 多线程同步篇
    用户模式下的线程同步原子访问指的是一个线程在访问某个资源的同时能保证没有其他线程会在统一时刻访问同一资源。传入的变量必须是经过内存对齐的InterlockedExchang......
  • 开流运行多线程CompletableFuture
    CompletableFuture提高接口性能//根据排口查询因子信息(异步)CompletableFuture<List<FactorInfo>>listCompletableFuture=CompletableFuture.supplyAsyn......
  • 软件测试面试题理论大全
    1.测试的策略有哪些?黑盒/白盒,静态/动态,手工/自动,冒烟测试,回归测试,公测(Beta测试的策略)。2.设计测试用例的方法有哪些?等价类,边界值,正交表,流程图,错......
  • Java多线程批量操作,居然有人不做事务控制?
    前言公司业务中遇到一个需求,需要同时修改最多约5万条数据,而且还不支持批量或异步修改操作。于是只能写个for循环操作,但操作耗时太长,只能一步一步寻找其他解决方案。具体......
  • .net core 5,6,7【多线程笔记】取消令牌(CancellationToken)
    介绍在使用C#异步的场景,多多少少会接触到CancellationTokenSource。它和取消异步任务相关的,CancellationToken就是它生产出来的。演示任务取消执行回调vartokenSource......