15个线程方面的面试题

lateron 发布于 2013/05/31 15:39
阅读 1K+
收藏 14
1) You have thread T1, T2 and T3, how will you ensure that thread T2 run after T1 and thread T3 run after T2?

2) What is the advantage of new Lock interface over synchronized block in Java? You need to implement a high performance cache which allows multiple reader but single writer to keep the integrity how will you implement it?

3) What are differences between wait and sleep method in java?

4) Write code to implement blocking queue in Java?

5) Write code to solve the Produce consumer problem in Java?

6) Write a program which will result in deadlock? How will you fix deadlock in Java?

7) What is atomic operation? What are atomic operations in Java?

8) What is volatile keyword in Java? How to use it? How is it different from synchronized method in Java?

9) What is race condition? How will you find and solve race condition?

10) How will you take thread dump in Java? How will you analyze Thread dump?

11) Why we call start() method which in turns calls run() method, why not we directly call run() method ?

12) How will you awake a blocked thread in java?

13) What is difference between CyclicBarriar and CountdownLatch in Java ?

14) What is immutable object? How does it help on writing concurrent application?

15) What are some common problems you have faced in multi-threading environment? How did you resolve it?




加载中
0
祺爸PiscDong
祺爸PiscDong
E文理解不能
止殇
止殇
放到有序队列里边
lateron
lateron
1.有三线程,要控制线程的执行顺序,请答题。
0
加酸
加酸
what's the fuck?
lateron
lateron
.....
0
烟头
烟头

1.wait+notify


0
不正常的物种
不正常的物种
信号灯,可以实现线程顺序的控制
0
Josephn_Clark
Josephn_Clark

1) You have thread T1, T2 and T3, how will you ensure that thread T2 run after T1 and thread T3 run after T2? 

主线程,中NEW 3个线程,调用t1.start()后,执行t1.join();T2,T3重复上述动作即可。

0
南北024
南北024

引用来自“清风居士”的答案

信号灯,可以实现线程顺序的控制
设置优先级不行嘛?
Ryan-瑞恩
Ryan-瑞恩
回复 @夕水溪下 : 那就强行先joinT2再T1再T3
lateron
lateron
优先级不靠谱
0
lateron
lateron

1.有三个线程T1,T2,T3,如何保证T1在T2前执行,T2在T3前执行?

说白了,就是要保证线程的执行顺序,可以通过线程通信的方式解决,比如notify,wait。再者就是通过信号量Semaphore来解决,说起Semaphore,咱又想起那个不知道在哪里看到的比喻,说我们可以把Semaphore看成停车厂的看门人,那我们的车就是线程,停车厂里还有三个停车位,但是有10量车要来,谁进,那就是看门人说了算,在代码里就是acquire方法与release方法分别进停车厂与出停车厂。要用他来控制顺序,可以这么搞:

Semaphore a = new Semaphore(1);
Semaphore b = new Semaphore(0);
Semaphore c = new Semaphore(0);
定义三个看门的来指挥,然后在线程逻辑里来控制数量。


止殇
止殇
把线程按照顺序放进去,在取出来 就是按序的,亲
lateron
lateron
受楼上启发,join方法也可以实现。
0
Josephn_Clark
Josephn_Clark

2) What is the advantage of new Lock interface over synchronized block in Java? You need to implement a high performance cache which allows multiple reader but single writer to keep the integrity how will you implement it? 

LOCK接口相对于synchronized块,来说,主要增加了对锁的更灵活的操作,以及对共享变量的不同锁共用的形式。

简单实现:cache对象的put方法写上synchronized,保证只有1个线程进行写入,get方法就是一般的方法.
put方法中,会产生新的内存区域,并将原来的内存区域中的数据复制到这个新区域中,之后将新的东西放入这个新区域中,最后把read要调用的这个区域指针指向这个新区域。(拷贝复制原理)。

Josephn_Clark
Josephn_Clark
@夕水溪下 这里要提醒下:计算机内存存储东西只有2种结构,顺序的,离散(链表)的。。在并发编程的历史里,都原因在这个圈圈内打转,如果跳出这个圈圈,是另外一种结构,例如号称最快的处理系统disruptor,它就是认为锁是有开销的,去掉这个开销用空间来换取时间
lateron
lateron
回复 @Josephn_Clark : 读写锁,在并发读的时候也没有锁。你的方法不错。
Josephn_Clark
Josephn_Clark
@夕水溪下 而你所想的是。。这个容器内的槽。。而我所谓的设置是用新的容器替换掉这个老的容器
Josephn_Clark
Josephn_Clark
@夕水溪下 临界区。。=。= 这里是读指令与写指令,针对cpu的。。不会有临界区。。。调用时机,没有就没有,有就有。。这就是并发
Josephn_Clark
Josephn_Clark
@夕水溪下 最好的方式是没有锁,锁是有代价的。会降低并发性。而我们所要做的是提高并发性
下一页
0
Josephn_Clark
Josephn_Clark

3) What are differences between wait and sleep method in java?

最大的区别,wait不能自己唤醒自己,需要别的线程来唤醒它,sleep只能自己唤醒自己。

Josephn_Clark
Josephn_Clark
@Ellipse 当然答案要落在并发编程方面:这个是你对题目的理解。按这个理解我可不可以说是:wait可以用于多线程之间的控制,而sleep呢,没法用于多线程之间的控制,这么一说咯,这样说的话,等于没说。=。=
E
Ellipse
回复 @Josephn_Clark : 呵呵,sleep可以被interrupt唤醒(中断)。既然是并发编程的题,当然答案要落在并发编程方面,谁唤醒谁对这道题来说是无关紧要的。
Josephn_Clark
Josephn_Clark
@Ellipse 恩啊,可以这么说,可是在超时时间内,他还是可能被别人唤醒哇。。=。= 而sleep就不行
E
Ellipse
回复 @Josephn_Clark : 这么说的话,wait也可以设置超时的,超时以后也算是唤醒自己了(自己从床上掉下来摔醒了)
Josephn_Clark
Josephn_Clark
回复 @Ellipse : 那是wait的使用环境,synchronized块中。而sleep可以不在synchronized中使用.
下一页
0
Josephn_Clark
Josephn_Clark

4) Write code to implement blocking queue in Java?

在get(),put()都加上synchronized ,至于容器采用数组还是集合类,随意了。

Josephn_Clark
Josephn_Clark
回复 @夕水溪下 : 这也体现了,需要被阻塞的对象。。呵呵
lateron
lateron
回复 @Josephn_Clark : Queue 接口并未定义阻塞队列的方法,而这在并发编程中是很常见的。BlockingQueue 接口定义了那些等待元素出现或等待队列中有可用空间的方法,这些方法扩展了此接口
Josephn_Clark
Josephn_Clark
@夕水溪下 比如队列为空的时候,所有的读操作都wait。这个。。队列没有说,获取时为空就一定要阻塞,你可以参考下jdk的queue描述
lateron
lateron
回复 @Josephn_Clark : 比如队列为空的时候,所有的读操作都wait。
Josephn_Clark
Josephn_Clark
@夕水溪下 这个题:对我的理解来说,考察的是如何让阻塞读写线程,其次,get永远获取头,put永远插入尾。至于其他的。。就要看还需要什么特性了
下一页
返回顶部
顶部