java 多线程简答题

  1. 1.简述进程和线程的联系和区别。

    (1)资源分配&处理器调度:进程是资源分配的基本单位,线程是处理器调度的基本单位。

    (2)地址空间:进程拥有独立的地址空间;线程没有独立的地址空间,同一进程内多个线程共享其资源。

    (3)划分尺度:线程更小,所以多线程程序并发性更高。

    (4)执行:一个程序至少有一个进程,一个进程至少有一个线程。

    2.创建线程的两种方式分别是什么?各有什么优缺点。

    第一种方式:继承Thread类 实现步骤:
    1.自定义类继承Thread
    2.覆盖Thread中的run()方法
    3.创建该类的对象,调用start()方法,开启线程并调用run方法 采用继承Thread类方式: (1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
    (2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。

    第二种方式:实现Runnable接口

    实现步骤:
    1.定义一个实现Runnable接口的类
    2.覆盖run方法
    3.创建该类对象,并以该类对象为参数创建Thread类的对象,从而创建了一个线程
    4.调用start方法,开启线程并调用run方法。 采用实现Runnable接口方式: (1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相
    同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
    (2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。

    3.请你简述sleep( )和wait( )有什么区别?

    1.sleep()方法是使线程停止一段时间的方法。在sleep时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其他线程可能正在运行而且没有被调度为放弃执行。

    2.wait()是线程交互时,如果线程对一个同步对象发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

    4.Java中实现线程通信的三个方法及其作用。

    wait():导致当前线程等待,直到其他线程调用该同步监视器的notify()方法或notifyAll()方法来唤醒该线程。
    notify():唤醒在此同步监视器上等待的单个线程。 notifyAll():唤醒在此同步监视器上等待的所有线程。

    5 现在有线程 T1、T2 和 T3。你如何确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行?

    这个线程面试题通常在第一轮面试或电话面试时被问到,这道多线程问题为了测试面试者是否熟悉 join 方法的概念。答案也非常简单——可以用
    Thread 类的 join 方法实现这一效果。

    6 Java 中新的 Lock 接口相对于同步代码块(synchronized
    block)有什么优势?如果让你实现一个高性能缓存,支持并发读取和单一写入,你如何保证数据完整性。

    多线程和并发编程中使用 lock 接口的最大优势是它为读和写提供两个单独的锁,可以让你构建高性能数据结构,比如
    ConcurrentHashMap 和条件阻塞。 这道 Java 线程面试题越来越多见,而且随后的面试题都基于面试者对这道题的回答。
    我强烈建议在任何 Java 多线程面试前都要多看看有关锁的知识,因为如今电子交易系统的客户端和数据交互中,锁被频繁使用来构建缓存。

    1. Java 中 wait 和 sleep 方法有什么区别?

    我们来看看另一个经常被问到的线程面试题。这道题常出现在电话面试中。两者主要的区别就是等待释放锁和监视器。sleep方法在等待时不会释放任何锁或监视器。wait
    方法多用于线程间通信,而 sleep 只是在执行时暂停。可以看我另一篇有关Java 中 wait 和 sleep的文章。

    1. 如何在 Java 中实现一个阻塞队列?

    这是一道相对困难的 Java 多线程面试题,考察点很多。它考察了面试者是否真正写过 Java
    多线程代码,考察了面试者对并发场景的理解。并且可以根据面试者的代码问很多后续问题,如果他用 wait() 和 notify()
    方法成功实现了阻塞队列,可以让他用 Java 5 的并发类重新实现一次。

    1. 如何在 Java 中编写代码解决生产者消费者问题?答案

    和上面有关线程的问题相似,这个问题在工作中很典型,但有时面试官会问这类问题,比如“在 Java
    中如何解决生产者消费者问题?”其实,有很多解决方式。我分享过用 Java 中 BlockingQueue
    的解决方案。有时他们甚至会让你给出哲学家进餐问题的解决方案。

    1. 写一段死锁代码。你在 Java 中如何解决死锁?

    这是我最喜欢的 Java 多线程面试题,因为即使死锁在多线程并发编程中十分常见,许多面试者仍然抓耳挠腮,不能写出无死锁的代码。
    只需要问他们如果有 N 个资源和 N 个线程去执行某个操作,然后请求所有资源。 这里的 N 可以是 2
    作为最简单的情况,也可以是个很大的数字让问题变复杂。有关死锁的更多信息可以看这篇文章Java 中如何避免死锁。

    1. 什么是原子操作?Java 中有哪些原子操作?

    这是个简单的 Java 线程面试题。另一个紧随其后的问题将是:你需要同步原子操作吗?你可以看这篇文章了解更多Java 同步。

    1. Java 中 volatile 关键字是什么?你如何使用它?它和 Java 中的同步方法有什么区别?

    自从 Java 5 中调整 volatile 关键字和 Java 内存模型后,有关 volatile 关键字的线程问题越来越常见。掌握
    volatile变量在并发环境中如何确保可见性、有序性和一致性非常重要。

    1. 什么是竞态条件?你如何发现并解决竞态条件?

    这个 Java
    多线程问题一般出现在高级面试。多数面试官会问你最近一次遇到的竞态条件,如何解决的,有时他们也会写点简单代码让你发现竞态条件。可以看看我的这篇文章Java
    中的竞态条件。我认为,这是最棒的 Java
    线程面试问题之一,而且可以测试出面试者解决竞态条件的经验,或是编写无数据竞争、无其竞态条件的代码经验。

    1. 在 Java 中你如何转储线程(thread dump)?如何分析它?

    在 UNIX 中,你可以使用 kill -3 然后线程转储日志会打印在屏幕上,可以使用 CTRL+Break
    查看。这只是一个较简单的线程面试题,狡猾一点的话他们会问你如何分析转储日志。线程转储日志对于分析死锁情况非常有用。

    1. 既然 start() 方法会调用 run() 方法,为什么我们调用 start() 方法,而不直接调用 run() 方法?

    这是一个基本的 Java 多线程面试题。最初,我刚开始多线程编程时对此还有些困惑。如今我一般在 Java
    中级面试的电话面试或一轮面试中遇到。 这道问题的答案是这样的。当你调用 start() 方法时,它会新建一个线程然后执行 run()
    方法中的代码。如果直接调用 run() 方法,并不会创建新线程,方法中的代码会在当前调用者的线程中执行。可以看这篇文章了解更多线程中
    Start 和 Run 方法的区别。

    16 Java 中你如何唤醒阻塞线程?

    这是有关线程的一个很狡猾的问题。有很多原因会导致阻塞,如果是 IO
    阻塞,我认为没有方式可以中断线程(如果有的话请告诉我)。另一方面,如果线程阻塞是由于调用了 wait(),sleep() 或
    join() 方法,你可以中断线程,通过抛出 InterruptedException
    异常来唤醒该线程。可以看这篇文章了解有关处理阻塞线程的知识Java 中如何处理阻塞方法。

    1. Java 中 CyclicBarriar 和 CountdownLatch 有什么区别?

    最近的 Java 线程面试题多数在测试你对 JDK 5 并发包的掌握程度。两者区别之一就是 CyclicBarrier
    在屏障打开之后(所有线程到达屏障点),可以重复使用。而 CountDownLatch 不行。想了解更多可以参与课程Java
    中的多线程和并行计算。

    1. 什么是不可变类?它对于编写并发应用有何帮助?

    尽管这道面试题和线程没有直接关系,但间接影响也很大。如果面试官随后让你写一个不可变类,或问你为什么 Java 中的 String
    是不可变的,会让面试题变得更加复杂。

    1. 你在多线程环境中遇到的最多的问题是什么?你如何解决的?

    内存干扰、竞态条件、死锁、活锁、线程饥饿是多线程和并发编程中比较有代表性的问题。这类问题无休无止,而且难于定位和调试。
    这是基于经验给出的 Java 面试题。你可以看看Java 并发实战课程来了解现实生活中高性能多线程应用所面临的问题。

    上面所说的是我喜欢的,也是投行最常问的 Java 线程面试题。这个清单并不完整,所以可以在下方评论出你在面试中遇到的有意思的 Java
    线程题目。这篇文章收集并分享与多线程概念有关的面试题,不仅仅有助于面试,还为大家打开多线程概念的大门。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值