前言
不管你是新程序员还是老手, 你一定在面试中遇到过有关线程的问题. Java 语言一个重要的特点就是内置了对并发的支持, 让 Java 大受企业和程序员的欢迎. 大多数待遇丰厚的 Java 开发职位都要求开发者精通多线程技术并且有丰富的 Java 程序开发, 调试, 优化经验, 所以线程相关的问题在面试中经常会被提到.
下面是我自己收集整理的 Java 线程相关的面试题, 可以用它来好好准备面试.
为了解决小伙伴们的燃眉之急, 小编特地为大家整理了一些 Java 相关的面试题, 可以加小编的 QQ 群: 937053620, 获取! 后期也会不断更新添加新的面试题, 希望可以帮助到大家.
若有问题, 欢迎提出, 共同进步!
1) 什么是线程?
线程是操作系统能够进行运算调度的最小单位, 它被包含在进程之中, 是进程中的实际运作单位. 程序员可以通过它进行多处理器编程, 你可以使用多线程对运算密集型任务提速. 比如, 如果一个线程完成一个任务要 100 毫秒, 那么用十个线程完成该任务只需 10 毫秒.
2) 线程和进程有什么区别?
一个进程是一个独立 (self contained) 的运行环境, 它可以被看作一个程序或者一个应用. 而线程是在进程中执行的一个任务. 线程是进程的子集, 一个进程可以有很多线程, 每条线程并行执行不同的任务. 不同的进程使用不同的内存空间, 而所有的线程共享一片相同的内存空间. 别把它和栈内存搞混, 每个线程都拥有单独的栈内存用来存储本地数据.
3) 如何在 Java 中实现线程?
有两种创建线程的方法: 一是实现 Runnable 接口, 然后将它传递给 Thread 的构造函数, 创建一个 Thread 对象; 二是直接继承 Thread 类.
4) 用 Runnable 还是 Thread?
这个问题是上题的后续, 大家都知道我们可以通过继承 Thread 类或者调用 Runnable 接口来实现线程, 问题是, 那个方法更好呢? 什么情况下使用它? 这个问题很容易回答, 如果你知道 Java 不支持类的多重继承, 但允许你调用多个接口. 所以如果你要继承其他类, 当然是调用 Runnable 接口好了.
5) Thread 类中的 start() 和 run() 方法有什么区别?
start()方法被用来启动新创建的线程, 使该被创建的线程状态变为可运行状态. 当你调用 run()方法的时候, 只会是在原来的线程中调用, 没有新的线程启动, start()方法才会启动新线程. 如果我们调用了 Thread 的 run()方法, 它的行为就会和普通的方法一样, 直接运行 run()方法. 为了在新的线程中执行我们的代码, 必须使用 Thread.start()方法.
6) Java 中 CyclicBarrier 和 CountDownLatch 有什么不同?
CyclicBarrier 和 CountDownLatch 都可以用来让一组线程等待其它线程. 与 CyclicBarrier 不同的是, CountdownLatch 不能重新使用.
7) Java 内存模型是什么?
Java 内存模型规定和指引 Java 程序在不同的内存架构, CPU 和操作系统间有确定性地行为. 它在多线程的情况下尤其重要. Java 内存模型对一个线程所做的变动能被其它线程可见提供了保证, 它们之间是先行发生关系. 这个关系定义了一些规则让程序员在并发编程时思路更清晰. 比如, 先行发生关系确保了:
线程内的代码能够按先后顺序执行, 这被称为程序次序规则.
对于同一个锁, 一个解锁操作一定要发生在时间上后发生的另一个锁定操作之前, 也叫做管程锁定规则.
前一个对 volatile 的写操作在后一个 volatile 的读操作之前, 也叫 volatile 变量规则.
一个线程内的任何操作必需在这个线程的 start()调用之后, 也叫作线程启动规则.
一个线程的所有操作都会在线程终止之前, 线程终止规则.
一个对象的终结操作必需在这个对象构造完成之后, 也叫对象终结规则.
可传递性
8) 什么是线程安全? Vector 是一个线程安全类吗?
如果你的代码所在的进程中有多个线程在同时运行, 而这些线程可能会同时运行这段代码. 如果每次运行结果和单线程运行的结果是一样的, 而且其他的变量的值也和预期的是一样的, 就是线程安全的. 一个线程安全的计数器类的同一个实例对象在被多个线程使用的情况下也不会出现计算失误. 很显然你可以将集合类分成两组, 线程安全和非线程安全的. Vector 是用同步方法来实现线程安全的, 而和它相似的 ArrayList 不是线程安全的.
9) 一个线程运行时发生异常会怎样?
如果异常没有被捕获该线程将会停止执行. Thread.UncaughtExceptionHandler 是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口. 当一个未捕获异常将造成线程中断的时候 JVM 会使用 Thread.getUncaughtExceptionHandler()来查询线程的 UncaughtExceptionHandler 并将线程和异常作为参数传递给 handler 的 uncaughtException()方法进行处理.
10) Java 中的 fork join 框架是什么?
ork join 框架是 JDK7 中出现的一款高效的工具, Java 开发人员可以通过它充分利用现代服务器上的多处理器. 它是专门为了那些可以递归划分成许多子模块设计的, 目的是将所有可用的处理能力用来提升程序的性能. fork join 框架一个巨大的优势是它使用了工作窃取算法, 可以完成更多任务的工作线程可以从其它线程中窃取任务来执行.
11) 什么是 FutureTask?
FutureTask 包装器是一种非常便利的机制, 可将 Callable 转换成 Future 和 Runnable, 它同时实现两者的接口.
FutureTask 类是 Future 的一个实现, 并实现了 Runnable, 所以可通过 Excutor(线程池) 来执行. 也可传递给 Thread 对象执行. 如果在主线程中需要执行比较耗时的操作时, 但又不想阻塞主线程时, 可以把这些作业交给 Future 对象在后台完成, 当主线程将来需要时, 就可以通过 Future 对象获得后台作业的计算结果或者执行状态.
12) 什么是并发容器的实现?
Java 集合类都是快速失败的, 这就意味着当集合被改变且一个线程在使用迭代器遍历集合的时候, 迭代器的 next()方法将抛出 ConcurrentModificationException 异常.
并发容器: 并发容器是针对多个线程并发访问设计的, 在 jdk5.0 引入了 concurrent 包, 其中提供了很多并发容器, 如 ConcurrentHashMap,CopyOnWriteArrayList 等. 并发容器使用了与同步容器完全不同的加锁策略来提供更高的并发性和伸缩性, 例如在 ConcurrentHashMap 中采用了一种粒度更细的加锁机制, 可以称为分段锁, 在这种锁机制下, 允许任意数量的读线程并发地访问 map, 并且执行读操作的线程和写操作的线程也可以并发的访问 map, 同时允许一定数量的写操作线程并发地修改 map, 所以它可以在并发环境下实现更高的吞吐量.
13)线程之间是如何通信的?
当线程间是可以共享资源时, 线程间通信是协调它们的重要的手段. Object 类中 wait()\notify()\notifyAll()方法可以用于线程间通信关于资源的锁的状态.
14)为什么 Thread 类的 sleep()和 yield()方法是静态的?
Thread 类的 sleep()和 yield()方法将在当前正在执行的线程上运行. 所以在其他处于等待状态的线程上调用这些方法是没有意义的. 这就是为什么这些方法是静态的. 它们可以在当前正在执行的线程中工作, 并避免程序员错误的认为可以在其他非运行线程调用这些方法.
15)如何确保线程安全?
在 Java 中可以有很多方法来保证线程安全 -- 同步, 使用原子类(atomic concurrent classes), 实现并发锁, 使用 volatile 关键字, 使用不变类和线程安全类.
16)同步方法和同步块, 哪个是更好的选择?
同步块是更好的选择, 因为它不会锁住整个对象(当然你也可以让它锁住整个对象). 同步方法会锁住整个对象, 哪怕这个类中有多个不相关联的同步块, 这通常会导致他们停止执行并需要等待获得这个对象上的锁.
18)如何创建守护线程?
使用 Thread 类的 setDaemon(true)方法可以将线程设置为守护线程, 需要注意的是, 需要在调用 start()方法前调用这个方法, 否则会抛出 IllegalThreadStateException 异常.
19) 在线程中你怎么处理不可捕捉异常?
Thread.UncaughtExceptionHandler 是 java SE5 中的新接口, 它允许我们在每一个 Thread 对象上添加一个异常处理器.
以上就是热门 Java 多线程和并发面试题啦, 这篇文章不仅可以用来准备面试, 还能检查你对多线程, 并发, 设计模式和竞态条件, 死锁和线程安全等线程问题的理解.
这篇文章对初学者或者是经验丰富的 Java 开发人员都很有用, 过两三年甚至五六年你再读它也会受益匪浅. 它可以扩展初学者尤其有用因为这个可以扩展他们的知识面, 我会不断更新这些题, 大家可以在文章后面的评论中提问, 分享和回答问题一起把这篇面试题完善.
来源: http://www.jianshu.com/p/6d99896fb8ac