前言: 再过一个月的时间就是金三银四了,相信不少的朋友对于已经做好了充足的准备来应对这一次春招,小编对大家也没有太多的建议和帮助,分享一些你们面试上面可以用得到的一些面试题。今天主要给大家分享多线程(线程安全)方面的面试题,看到文章的小伙伴一定要看到后面哦,有海量的面试题分享给大家哟。 1、什么叫线程安全?servlet是线程安全吗?线程安全 就是多线程在运行期间不会产生不符合常规的数据。 同样在多线程访问同一代码,不会产生不确定的结果 线程安全首先呢他的是多线程,至少是2个。因为一个线程那肯定是线程安全的。就你自己一个线程执行没有人给你争用资源。你是在串行执行,不会出现不确定结果。 如果有多个线程 那问题可就多了。比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成: 1. 在 Items[Size] 的位置存放此元素; 2. 增大 Size 的值。 线程A完成第一步时,被CPU暂停了。此时Size值还是原来的值线程B并不知情,又跑到线程A刚才放元素的位置又放了一遍,然后Size+1。紧接着A也被唤醒了,也去Size+1 这时候Size = 2了,但是只有一个元素。虽然放了两次放到了同样的位置上覆盖了。 怎么解决这个问题?可以好好思考一下 1、把操作设置成原子操作,哥执行的时候不被别人打扰。 2、让修改过的值实时告知给其他线程。 3、还有我继续想~ Servlet是线程不安全的。 2、同步有几种实现方法?同步有两种方法 分别是synchronized wait与notify 3、请说明下java的内存模型及其工作流程。Java内存模型就是 java内存分为主内存和工作内存。 多线程 每一个线程都会有一个自己的工作内存,所使用到的变量都是主内存的一份拷贝。 4、volatile有什么用?能否用一句话说明下volatile的应用场景?Volatile 的作用就是多线程使用同一个变量时,每次都去主内存去读。保障了数据的实时性。 应用场景就是多线程 操作同一个变量。 5、多线程执行怎么保障变量的可见性?可见性:就是一个线程修改了变量,其他线程可以立即知道 保证可见性的方法 volatile synchronized (unlock之前,写变量值回主存) final(一旦初始化完成,其他线程就可见) 6、为什么代码会重排序?代码重排序是为了CPU的高效率执行。 JVM指令重排的基本原则 - 程序顺序原则:一个线程内保证语义的串行性
- volatile规则:volatile变量的写,先发生于读
- 锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
- 传递性:A先于B,B先于C 那么A必然先于C
- 线程的start方法先于它的每一个动作
- 线程的所有操作先于线程的终结(Thread.join())
- 线程的中断(interrupt())先于被中断线程的代码
- 对象的构造函数执行结束先于finalize()方法
关于JAVA 多线程并发知识点总结(思维导图)
总结: Java多线程一直是大厂面试考察的一个重点,上面给大家展示的是一部分学习路线,由于文章的长度限制,没有将所有的答案都给大家分享出来,除了Java多线程,小编还整理了有微服务,开源框架,并发编程,分布式专题,有需要的朋友可以关注小编+转发文章+私信【面试真题】获取。
|