加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Java面 试题|多线程22道必看面试题

发布时间:2022-11-21 12:31:54 所属栏目:Linux 来源:
导读:  上两篇:1.并行和并发有什么区别?

  发(concurrency)和并行(parallellism)是:

  解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。

  解
  上两篇:1.并行和并发有什么区别?
 
  发(concurrency)和并行(parallellism)是:
 
  解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
 
  解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
 
  解释三:在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群
 
  所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。
 
  如下图:
 
  线程池linux_net 线程池 (线程池)threadpool_线程池与线程
 
  并发 = 两个队列和一台咖啡机。
 
  并行 = 两个队列和两台咖啡机。
 
  2. 线程和进程的区别?
 
  ·性质不同
 
  进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
 
  线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
 
  ·适用范围不同
 
  使用进程目的在于清晰地刻画动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。
 
  线程为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。
 
  3. 守护线程是什么?
 
  守护线程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。在 Java 中垃圾回收线程就是特殊的守护线程。
 
  4. 创建线程有哪几种方式?
 
  创建线程有三种方式:
 
  5. 说一下 runnable 和 callable 有什么区别?
 
  runnable 没有返回值线程池linux,callable 可以拿到有返回值,callable 可以看作是 runnable 的补充。
 
  6. 线程有哪些状态?
 
  线程的状态:
 
  7. sleep() 和 wait() 有什么区别?8. notify()和 notifyAll()有什么区别?
 
  notifyAll()会唤醒所有的线程,notify()之后唤醒一个线程。notifyAll() 调用后,会将全部线程由等待池移到锁池,然后参与锁的竞争,竞争成功则继续执行,如果不成功则留在锁池等待锁被释放后再次参与竞争。而 notify()只会唤醒一个线程,具体唤醒哪一个线程由虚拟机控制。
 
  9. 线程的 run() 和 start() 有什么区别?
 
  start() 方法用于启动线程,run() 方法用于执行线程的运行时代码。run() 可以重复调用,而 start() 只能调用一次。
 
  10. 创建线程池有哪几种方式?
 
  线程池创建有七种方式,最核心的是最后一种:
 
  11. 线程池都有哪些状态?12. 线程池中 submit() 和 execute() 方法有什么区别?
 
  Callable 类型的任务可以获取执行的返回值,而 Runnable 执行无返回值。
 
  13. 在 Java 程序中怎么保证多线程的运行安全?
 
  手动锁 Java 示例代码如下:
 
  Lock lock = new ReentrantLock();
  lock. lock();
  try {
      System. out. println("获得锁");
  } catch (Exception e) {
      // TODO: handle exception
  } finally {
      System. out. println("释放锁");
      lock. unlock();
  }
  14. 多线程中 synchronized 锁升级的原理是什么?
 
  synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级。
 
  锁的升级的目的:锁升级是为了减低了锁带来的性能消耗。在 Java 6 之后优化 synchronized 的实现方式,使用了偏向锁升级为轻量级锁再升级到重量级锁的方式,从而减低了锁带来的性能消耗。
 
  15. 什么是死锁?
 
  当线程 A 持有独占锁a,并尝试去获取独占锁 b 的同时,线程 B 持有独占锁 b,并尝试获取独占锁 a 的情况下,就会发生 AB 两个线程由于互相持有对方需要的锁,而发生的阻塞现象,我们称为死锁。
 
  16. 怎么防止死锁?17. ThreadLocal 是什么?有哪些使用场景?
 
  ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
 
  ThreadLocal 的经典使用场景是数据库连接和 session 管理等。
 
  18. 说一下 synchronized 底层实现原理?
 
  synchronized 是由一对 monitorenter/monitorexit 指令实现的,monitor 对象是同步的基本实现单元。在 Java 6 之前,monitor 的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作,性能也很低。但在 Java 6 的时候,Java 虚拟机 对此进行了大刀阔斧地改进,提供了三种不同的 monitor 实现,也就是常说的三种不同的锁:偏向锁(Biased Locking)、轻量级锁和重量级锁,大大改进了其性能。
 
  19. synchronized 和 volatile 的区别是什么?20. synchronized 和 Lock 有什么区别?21. synchronized 和 ReentrantLock 区别是什么?
 
  synchronized 早期的实现比较低效,对比 ReentrantLock,大多数场景性能都相差较大,但是在 Java 6 中对 synchronized 进行了非常多的改进。
 
  主要区别如下:
 
  22. 说一下 atomic 的原理?
 
  atomic 主要利用 CAS (Compare And Wwap) 和 volatile 和 native 方法来保证原子操作,从而避免 synchronized 的高开销,执行效率大为提升。
 

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!