没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Java 线程面试 TOP50
在典型的 Java 面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使
用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承 thread 类
还是调用 Runnable 接口),然后逐渐问到并发问题像在 Java 并发编程的过程中
遇到了什么挑战,Java 内存模型,JDK1.5 引入了哪些更高阶的并发工具,并发
编程常用的设计模式,经典多线程问题如生产者消费者,哲学家就餐,读写器
或者简单的有界缓冲区问题。仅仅知道线程的基本概念是远远不够的, 你必须
知道如何处理死锁,竞态条件,内存冲突和线程安全等并发问题。掌握了这些
技巧,你就可以轻松应对多线程和并发面试了。
1) 什么是线程?
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程
中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程
对运算密集型任务提速。比如,如果一个线程完成一个任务要 100 毫秒,那么
用十个线程完成改任务只需 10 毫秒。Java 在语言层面对多线程提供了卓越的
支持。
2) 线程和进程有什么区别?
线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任
务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空
间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。
3) 如何在 Java 中实现线程?
在语言层面有两种方式。java.lang.Thread 类的实例就是一个线程但是它需要调
用 java.lang.Runnable 接口来执行,由于线程类本身就是调用的 Runnable 接口
所以你可以继承 java.lang.Thread 类或者直接调用 Runnable 接口来重写 run()方
法实现线程。
4) 用 Runnable 还是 Thread?
这个问题是上题的后续,大家都知道我们可以通过继承 Thread 类或者调用
Runnable 接口来实现线程,问题是,那个方法更好呢?什么情况下使用它?这
个问题很容易回答,如果你知道 Java 不支持类的多重继承,但允许你调用多个
接口。所以如果你要继承其他类,当然是调用 Runnable 接口好了。
6) Thread 类中的 start() 和 run() 方法有什么区别?
这个问题经常被问到,但还是能从此区分出面试者对 Java 线程模型的理解程
度。start()方法被用来启动新创建的线程,而且 start()内部调用了 run()方法,这
和直接调用 run()方法的效果不一样。当你调用 run()方法的时候,只会是在原来
的线程中调用,没有新的线程启动,start()方法才会启动新线程。
7) Java 中 Runnable 和 Callable 有什么不同?
Runnable 和 Callable 都代表那些要在不同的线程中执行的任务。Runnable 从
JDK1.0 开始就有了,Callable 是在 JDK1.5 增加的。它们的主要区别是 Callable
的 call() 方法可以返回值和抛出异常,而 Runnable 的 run()方法没有这些功
能。Callable 可以返回装载有计算结果的 Future 对象。
8) Java 中 CyclicBarrier 和 CountDownLatch 有什么不同?
CyclicBarrier 和 CountDownLatch 都可以用来让一组线程等待其它线程。与
CyclicBarrier 不同的是,CountdownLatch 不能重新使用。
9) Java 内存模型是什么?
Java 内存模型规定和指引 Java 程序在不同的内存架构、CPU 和操作系统间有确
定性地行为。它在多线程的情况下尤其重要。Java 内存模型对一个线程所做的
变动能被其它线程可见提供了保证,它们之间是先行发生关系。这个关系定义
了一些规则让程序员在并发编程时思路更清晰。比如,先行发生关系确保了:
•线程内的代码能够按先后顺序执行,这被称为程序次序规则。
•对于同一个锁,一个解锁操作一定要发生在时间上后发生的另一个锁定操作之
前,也叫做管程锁定规则。
•前一个对 volatile 的写操作在后一个 volatile 的读操作之前,也叫 volatile 变量
规则。
•一个线程内的任何操作必需在这个线程的 start()调用之后,也叫作线程启动规
则。
•一个线程的所有操作都会在线程终止之前,线程终止规则。
•一个对象的终结操作必需在这个对象构造完成之后,也叫对象终结规则。
•可传递性
10) Java 中的 volatile 变量是什么?
volatile 是一个特殊的修饰符,只有成员变量才能使用它。在 Java 并发程序缺少
同步类的情况下,多线程对成员变量的操作对其它线程是透明的。volatile 变量
可以保证下一个读取操作会在前一个写操作之后发生,就是上一题的 volatile 变
量规则。
11) 什么是线程安全?Vector 是一个线程安全类吗? (详见这里)
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运
行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变
量的值也和预期的是一样的,就是线程安全的。一个线程安全的计数器类的同
一个实例对象在被多个线程使用的情况下也不会出现计算失误。很显然你可以
将集合类分成两组,线程安全和非线程安全的。Vector 是用同步方法来实现线
程安全的, 而和它相似的 ArrayList 不是线程安全的。
12) Java 中什么是竞态条件? 举个例子说明。
竞态条件会导致程序在并发情况下出现一些 bugs。多线程对一些资源的竞争的
时候就会产生竞态条件,如果首先要执行的程序竞争失败排到后面执行了,那
么整个程序就会出现一些不确定的 bugs。这种 bugs 很难发现而且会重复出
现,因为线程间的随机竞争。
13) Java 中如何停止一个线程?
Java 提供了很丰富的 API 但没有为停止线程提供 API。JDK 1.0 本来有一些像
剩余18页未读,继续阅读
资源评论
shandongwill
- 粉丝: 3370
- 资源: 389
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功