一个小伙伴最近参加某一线互联网公司的面试,被问到了一些并发相关的问题,看看大家能否答出来:
(1)synchronized的CPU原语级别是如何实现的?
(2)无锁、偏向锁、轻量级锁、重量级锁有什么差别,升级过程如何?
(3)线程间通信,同机器进程间通信,跨机器进程间通信,各有什么方法?
(4)下列三种业务,应该如何使用线程池:
(5)秒杀系统,如何能够撑住100W级别TPS(淘宝最高54万TPS)?
下面这些是我在不同时间不同地点喜欢问的Java线程问题。我没有提供答案,但只要可能我会给你线索,有些时候这些线索足够回答问题。
1.现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?
这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉。这个多线程问题比较简单,可以用join方法实现。
2.在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户些,以此来保持它的完整性,你会怎样去实现它?
lock接口在多线程和并发编程中最大的优势是它们为读和写分别提供了锁,它能满足你写像ConcurrentHashMap这样的高性能数据结构和有条件的阻塞。Java线程面试的问题越来越会根据面试者的回答来提问。我强烈建议在你去参加多线程的面试之前认真读一下Locks,因为当前其大量用于构建电子交易系统的客户端缓存和交易连接空间。
3.在java中wait和sleep方法的不同?
通常会在电话面试中经常被问到的Java线程面试问题。最大的不同是在等待时wait会释放锁,而sleep一直持有锁。Wait通常被用于线程间交互,sleep通常被用于暂停执行。
4.用Java写代码来解决生产者——消费者问题。
与上面的问题很类似,但这个问题更经典,有些时候面试都会问下面的问题。在Java中怎么解决生产者——消费者问题,当然有很多解决方法,我已经分享了一种用阻塞队列实现的方法。有些时候他们甚至会问怎么实现哲学家进餐问题。
5.你将如何使用thread dump?你将如何分析Thread dump?
在UNIX中你可以使用kill -3,然后thread dump将会打印日志,在windows中你可以使用”CTRL+Break”。非常简单和专业的线程面试问题,但是如果他问你怎样分析它,就会很棘手。
6.用Java编程一个会导致死锁的程序,你将怎么解决?
这是我最喜欢的Java线程面试问题,因为即使死锁问题在写多线程并发程序时非常普遍,但是很多候选者并不能写deadlock free code(无死锁代码?),他们很挣扎。只要告诉他们,你有N个资源和N个线程,并且你需要所有的资源来完成一个操作。为了简单这里的n可以替换为2,越大的数据会使问题看起来更复杂。通过避免Java中的死锁来得到关于死锁的更多信息。
7.你在多线程环境中遇到的共同的问题是什么?你是怎么解决它的?
多线程和并发程序中常遇到的有Memory-interface、竞争条件、死锁、活锁和饥饿。问题是没有止境的,如果你弄错了,将很难发现和调试。这是大多数基于面试的,而不是基于实际应用的Java线程问题。
8.为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
这是一个非常经典的java多线程面试问题。这也是我刚开始写线程程序时候的困惑。现在这个问题通常在电话面试或者是在初中级Java面试的第一轮被问到。这个问题的回答应该是这样的,当你调用start()方法时你将创建新的线程,并且执行在run()方法里的代码。但是如果你直接调用run()方法,它不会创建新的线程也不会执行调用线程的代码。
9.Java中的volatile关键是什么作用?怎样使用它?在Java中它跟synchronized方法有什么不同?
自从Java 5和Java内存模型改变以后,基于volatile关键字的线程问题越来越流行。应该准备好回答关于volatile变量怎样在并发环境中确保可见性、顺序性和一致性。
10.什么是不可变对象,它对写并发应用有什么帮助?
另一个多线程经典面试问题,并不直接跟线程有关,但间接帮助很多。这个java面试问题可以变得非常棘手,如果他要求你写一个不可变对象,或者问你为什么String是不可变的。
需要高清大图的小伙伴只需要关注+转发,后台私信”多线程“即可获取
针对性的了解相关的知识
《多线程与高并发》这两大块儿是现在面试问的越来越多,也是相对一个初级的程序员向中高级迈进的必须要踏过的一个坎儿。这本书带你将多线程的知识系统化,帮助你理解多线程在CPU层级的实现,以及这些实现如何一层一层的映射到那些上亿用户,千万QPS,百万TPS的系统。
如果平时只有CRUD的经验
不了解多线程与高并发,面对这样面试题,大概率一头雾水。
如果真是这样,建议要拿出4个小时的时间,参加一次马士兵老师的《多线程与高并发》训练营
只需2分钱
参加训练营与学习资料私信小编“高并发”获取
马士兵老师
99年清华毕业,从程序员干到CTO,虽然已经45岁,但宝刀未老,一直致力于推动Java、大数据、AI生根中国,其高并发直播课程广受欢迎,有千万次播放学习。
让骨灰级扫地神僧马士兵老师带你将多线程的知识系统化,帮助你理解多线程在CPU层级的实现,以及这些实现如何一层一层的映射到那些上亿用户,千万QPS,百万TPS的系统。
课程时间:
6.25~6.26每晚八点
课程价格:
原价299,本号粉丝仅需0.02元。
2分钱,买不了吃亏,买不了上当。
参加训练营私信小编“高并发”获取
1、synchronized关键字的字节码原语;
2、volatile关键字的字节码原语;
3、synchronized与volatile的硬件级实现;
4、无锁、偏向锁、轻量级锁、重量级锁的升级过程;
5、内存屏障的基本概念;
6、JVM规范如何要求内存屏障;
7、硬件层级内存屏障如何帮助java实现高并发;
8、面试第3题(线程间通讯)的8种解法;
9、作业;
1、线程池的学与思;
2、使用线程池的好与不好;
3、为什么阿里开发手册建议自定义线程池;
4、自定义线程池的最佳实践;
5、常见线程池类型与应用场景:
1)CachedPool
2)FixedThreadPool
3)ScheduledPool
4)WorkStealingPool
5)ForkJoinPool
6、比线程更牛X的线程,压测结果展现线程的威力;
7、总结;
相关的电子书、底层源码
总的来说,自己如果有想要去的大公司,一定要提升好自己,让自己的能力和素质与公司匹配的上,我也一直相信,机会永远是留给有准备的人。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。
以上学习资料均免费放送,最后祝愿各位身体健康,顺利拿到心仪的offer!
转发和评论这篇文章,然后关注小编,后台私信【多线程】即可打包带走所有资料~