28
回答
15个线程方面的面试题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
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?




举报
夕水溪下
发帖于5年前 28回/1K+阅
共有28个答案 最后回答: 3年前

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重复上述动作即可。

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);
定义三个看门的来指挥,然后在线程逻辑里来控制数量。


--- 共有 2 条评论 ---
止殇把线程按照顺序放进去,在取出来 就是按序的,亲 5年前 回复
夕水溪下受楼上启发,join方法也可以实现。 5年前 回复

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要调用的这个区域指针指向这个新区域。(拷贝复制原理)。

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

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

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

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

4) Write code to implement blocking queue in Java?

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

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