专业的JAVA编程教程与资源

网站首页 > java教程 正文

5个Java多线程面试题,快来看看你是不是都能答上来

temp10 2024-09-30 00:12:31 java教程 9 ℃ 0 评论

如何唤醒一个阻塞的线程?

这个问题需要分情况来分析,首先我们来看看导致线程阻塞的几种情况:

  • 通过调用sleep使任务进入休眠状态

    5个Java多线程面试题,快来看看你是不是都能答上来

  • 通过调用wait使线程挂起

  • 等待IO

  • 等待可用的锁

接下来我们单独分析这几种阻塞的情况:

  • 对于调用sleep导致的阻塞,可以使用Thread.interrupt唤醒。

  • 调用wait的方法导致线程阻塞的,也可以使用Thread.interrupt进行唤醒。同时也可以调用notify/notifyAll进行唤醒,其中notify只会唤醒一个线程,需要持有相同object的线程进行竞争。调用notifyAll会唤醒所有持有相同object的线程。

  • 如果是由于等待IO导致的阻塞,通过java直接唤醒是比较困难的,这个时候就需要从外部资源入手,比如直接关闭对应资源的IO。

  • synchronized是无法直接被中断的,ReentrantLock则可以被中断。

多线程死锁

Java中的volatile关键字有什么作用?如何使用?它和synchronized有什么区别?

如果一个字段被声明或volatile,java线程内存模型确保所有线程看到这个变量值是一致的。volatile变量修饰符如果使用恰当的话,它比synchronized的使用和执行成本会更低,因为它不会引起线程上下文的切换和调度。

synchronized与volatile实现同步的区别:

  • synchronized是一个重量级的同步功能,会切换上下文。volatile是一个轻量级的同步功能,无需进行上下文的切换。

  • synchronized需要在不同线程中争抢同一个锁,会出现死锁的情况,而volatile则不需要进行争抢,也不会出现死锁的情况。

Java中的wait和sleep这两个方法有什么区别?

  • sleep方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非“醒来”的线程具有更高的优先级。

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

  • sleep是Thread中的方法,而wait是Object的方法。sleep不会释放所持有的锁,而wait会释放所持有的锁。

给你3个线程T1、T2和T3。如何保证T1执行后开始执行T2,T2执行以后开始执行T3?

如果知道join这个方法的功能,那么这个问题就没有任何难度了。这个面试题比较简单,面试官一般会在最开始的时候用这个问题来试探一下被面试者是否对多线程有所了解。

什么是原子操作?

所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何线程切换。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表