java面试题--多线程
一、哲学家就餐问题?
线程死锁问题。
解决死锁问题的方法:
- 增加锁的粒度。所有筷子放到一把大锁里。每次都锁定所有筷子。每次只能有一个哲学家抢到筷子,效率不高。
- 有一个哲学家是左撇子。每次只能有一个哲学家抢到筷子,效率不高。
- 每隔一个人就是一个左撇子。
二、交替输出问题?
解题方法:
- LockSupport.park();//阻塞线程 LockSupport.unpark();//唤醒线程
- 使用synchronized锁。
三、线程的nofity()方法按照什么顺序唤醒等待队列中的线程?
CFS
四、Lock condition 和synchronized wait\notify的区别?
- condition可以有多个等待队里了,wait/nofity只有一个等待队列。
- condition的await/signal可以有多个谓词条件,wait/nofity不能有多个谓词条件。
- condition是作用的实现Lock接口的锁上,而wait/notify是作用在synchronized锁上。
五、操作CountDownLatch的countDown()方法,一定要在当前线程进入到等待队列之前。如果当前线程进入等待队列后,无法执行任何操作。
六、说一下对LockSupport的理解?
- 为什么可以先唤醒线程后阻塞线程?因为unpark获取了一个凭证,之后再调用park方法,就可以名正言顺的凭证消费,故不会阻塞。
- 为什么唤醒两次后阻塞两次,但最终结果还会阻塞线程?因为凭证的数量最多为1,连续调用两次unpark和调用一次unpark效果一样,只会增加一个凭证;而调用两次park却需要消费两个凭证,证不够,不能放行。
七、说一下对线程池的理解?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!