面试败给 Java 并发?阿里 P8 提供 27 道并发面试解析,让你吊锤面试官
Java 线程池相关问题
![面试败给 Java 并发?阿里 P8 提供 27 道并发面试解析,让你吊锤面试官](https://img-blog.csdnimg.cn/img_convert/a125be52ffce31047ad9ff2a7096e3
36.png)
Java 内存模型相关问题
============================================================================
1.Synchronized 用过吗, 其原理是什么?
这是一道 Java 面试中几乎百分百会问到的问题, 因为没有任何写过并发程序的开发者会没听说或者没接触过 Synchronized。 Synchronized 是由 JVM 实现的一种实现互斥同步的一种方式, 如果你查看被 Synchronized 修饰过的程序块编译后的字节码, 会发现, 被 Synchronized 修饰过 的程序块, 在编译前后被编译器生成了 monitorenter 和 monitorexit 两个字节码指 令。这两个指令是什么意思呢? 在虚拟机执行到 monitorenter 指令时, 首先要尝试获取对象的锁: 如果这个对象没 有锁定, 或者当前线程已经拥有了这个对象的锁, 把锁 的 计 数 器 +1; 当 执 行 monitorexit 指令时将锁计 数 器 -1; 当计数器为 0 时 , 锁就被 释放了 。 如果获取对象失败了, 那当前线程就要阻塞等待, 直到对象锁被另外一个线程释放为 止。Java 中 Synchronize 通过在对象头设置标记 , 达到了获取锁和释放锁的目的 。
2.跟 Synchronized 相比, 可重入锁 Reentrant Lock 其实现原理有什么不同?
其实, 锁的实现原理基本是为了达到一个目的: 让所有的线程都能看到某种标记。 Synchronized 通过在对象头中设置标记实现了这一目的 , 是一种 JVM 原 生的锁实现方式, 而 Reentrant Lock 以及所有的基于 Lock 接口的实现类, 都是通过用一个 volitile 修饰的 int 型变量,并保证每个线程都能拥有对该 int 的可见性和原子修改, 其本质是基于所谓的 AQS 框架。
3. Java 中的线程池是如何实现的?
1.在 Java 中 , 所谓的线程池中的 “ 线 程 ” ,其 实 是 被 抽 象 为了一个静态内部类 Worker, 它 基 于 AQS 实 现 , 存 放 在 线 程 池 的 Hash Set< Worker> workers 成 员 变 量 中 ; 2.而需要执行的任务则存放在成员变量 work Queue ( Blocking Queue< Runnable> work Queue) 中。 这样 , 整个线程池实现的基本思想就是:从 work Queue 中不断取出需 要 执 行 的 任 务 , 放在 Workers 中进行处理 。
4.什么是 Java 的内存模型, Java 中各个线程是怎么彼此看到对方的变量的?
Java 的内存模型定义了程序中各个变量的访问规则, 即在虚拟机中将变量存储到内 存和从内存中取出这样的底层细节。 此处的变量包括实例字段、 静态字段和构成数组对象的元素, 但是不包括局部变量和 方法参数, 因为这些是线程私有的, 不会被共享, 所以不存在竞争问题。 Java 中各个线程是怎么彼此看到对方的变量的呢?**Java 中定义了主内存与工作内存 的概念:?**所有的变量都存储在主内存, 每条线程还有自己的工作内存, 保存了被该线程使用到 的变量的主内存副本拷贝。 线程对变量的所有操作( 读取、 赋值) 都必须在工作内存中进行, 不能直接读写主 内存的变量。 不同的线程之间也无法直接访问对方工作内存的变量, 线程间变量值的 传递需要通过主内存。
由于篇幅限制,太长看下去会很乏味,也会影响阅读体验,上面是每个题集的一题答案,下面展现将以图片形式展示。获取原文件以及更多资源请关注点赞分享后,后台**点这里**获取资料免费领取方式!
对下面学习笔记有需要的可以关注点赞后点这里获取资源免费获取方式。还有更多面试题整理中,可以一并获取。
评论