java面试题--多线程

一、哲学家就餐问题?

线程死锁问题。

解决死锁问题的方法:

  1. 增加锁的粒度。所有筷子放到一把大锁里。每次都锁定所有筷子。每次只能有一个哲学家抢到筷子,效率不高。
  2. 有一个哲学家是左撇子。每次只能有一个哲学家抢到筷子,效率不高。
  3. 每隔一个人就是一个左撇子。

二、交替输出问题?

解题方法:

  1. LockSupport.park();//阻塞线程   LockSupport.unpark();//唤醒线程
  2. 使用synchronized锁。

三、线程的nofity()方法按照什么顺序唤醒等待队列中的线程?

CFS

四、Lock condition 和synchronized wait\notify的区别?

  1. condition可以有多个等待队里了,wait/nofity只有一个等待队列。
  2. condition的await/signal可以有多个谓词条件,wait/nofity不能有多个谓词条件。
  3. condition是作用的实现Lock接口的锁上,而wait/notify是作用在synchronized锁上。

五、操作CountDownLatch的countDown()方法,一定要在当前线程进入到等待队列之前。如果当前线程进入等待队列后,无法执行任何操作。

六、说一下对LockSupport的理解?

  1. 为什么可以先唤醒线程后阻塞线程?因为unpark获取了一个凭证,之后再调用park方法,就可以名正言顺的凭证消费,故不会阻塞。
  2. 为什么唤醒两次后阻塞两次,但最终结果还会阻塞线程?因为凭证的数量最多为1,连续调用两次unpark和调用一次unpark效果一样,只会增加一个凭证;而调用两次park却需要消费两个凭证,证不够,不能放行。

 七、说一下对线程池的理解?

https://blog.csdn.net/ZhzZhi/article/details/117333878

posted @   翊梦  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示