Java多线程习题解
一、问题
1>.现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?
2>.在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它?
3>.在java中wait和sleep方法的不同?
4>.用Java实现阻塞队列。
5>.用Java写代码来解决生产者——消费者问题。
6>.用Java编程一个会导致死锁的程序,你将怎么解决?
7>.什么是原子操作,Java中的原子操作是什么?
8>.Java中的volatile关键是什么作用?怎样使用它?在Java中它跟synchronized方法有什么不同?
9>. 什么是竞争条件?你怎样发现和解决竞争?
10)>.你将如何使用thread dump?你将如何分析Thread dump?
11>. 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
12>.Java中你怎样唤醒一个阻塞的线程?
13>.在Java中CycliBarriar和CountdownLatch有什么区别?
14>.什么是不可变对象,它对写并发应用有什么帮助?
15>.你在多线程环境中遇到的常见的问题是什么?你是怎么解决它的?
二、答案&参考答案
1>.使用join方法。2>.ReadWriteLock适用于读多写少的并发场景
3>.等待时wait会释放锁,而sleep一直持有锁。Wait通常被用于线程间交互,sleep通常被用于暂停执行。
4>.wait()和notify()
5>.参见同步锁:生产者-消费者问题
6>.参见Multi-threaded design patterns -- Single Threaded Execution
7>.原子操作是不可分割的,从运行开始到结束,中间不会切换到另一线程
8>.参见Java Concurrency in Practice :基础知识(重排序与可见性)
9>.当多个进程或者线程在读写数据时,其最终的的结果依赖于多个进程的指令执行顺序。最后更新的进程决定变量的最终值
11>.start()方法是创建一个线程开始执行(与主线程同步),run()方法是创建一个线程(在主线程结束之后)开始执行
12>.notify()或者通过对InterruptedException的处理
14>.private final 属性,并不提供set方法,无法从类的外部改变该属性的值,一旦初始化便不可更改称为不可变对象(具体可参见Java中String为什么是不可变的)
第10、13、15参考答案:15个顶级Java多线程面试题及回答