每天一套面试题Day15-小米高频(1)

链接题目来自牛客

我的每日一套面试题专栏,每天更新一起打卡

1,说说synchronize的用法及原理

修饰静态方法,实例方法,代码块。锁可以是对象也可以是实例。 原理:对象头中的Mark Word,无锁,偏向锁,轻量级锁,重量级锁。

我的博客 Java中的synchronized是一种内置锁,用于实现线程同步。它有三种使用方式:同步实例方法(锁当前实例)、同步静态方法(锁Class对象)和同步代码块(可细粒度控制)。其原理基于Java对象头和Monitor机制,通过锁升级(无锁→偏向锁→轻量级锁→重量级锁)来优化性能。偏向锁消除无竞争开销,轻量级锁通过CAS自旋避免阻塞,而重量级锁则通过操作系统互斥锁实现线程阻塞。这种机制既保证了线程安全,又尽可能减少了性能损耗。

2.如何创建线程池?线程池常见参数有哪些?

ThreadPoolExcutor构造器,Excutors工具类 核心线程数,最大线程数,任务队列,非核心线程数最长空闲时间,拒绝策略

3.请你说说HashMap底层原理和扩容机制。

数组+链表 数组+链表/红黑树(JDK8以及之后,在链表长度>=8且数组长度≥64时时会变成红黑树。默认初始容量16,负载因子0.75当元素数目大于负载因子(0.75)×容量的时候,会发生扩容,扩容为原来的两倍,在jdk7之前要重新计算来确定位置,由于要么位置在原位置,要么在原位置+原数组长度,所以用哈希值与上原数组长度,如果为真,那么就在原位置+原数组长度,不然的话就不动。确定好在哈希桶的位置后,再尾插进对应的位置。

4.ConcurrentHashMap 线程安全的具体实现方式

1.在JDK 1.7中,ConcurrentHashMap采用了 “分段锁” 的策略

  • 当多个线程访问不同的 Segment 时,它们可以完全并行,因为锁是不同的。
  • 只有当多个线程访问同一个 Segment 时,才会发生竞争,需要获取同一个锁。
  1. JDK 1.8 是现在的标准 它的线程安全建立在三块基石上:
  • CAS:用于无竞争情况下的原子更新(如初始化、空桶插入),性能极高。
  • synchronized:用于有哈希碰撞时,锁住单个桶的头节点(链表头/树根节点),锁粒度非常细。
  • volatile:用于保证 get 操作的可见性,实现无锁读。

我的博客

5.请你说说ArrayList和LinkedList的区别。

ArrayList底层基于动态数组,因此用索引访问快,因为可以直接定位地址(基址+元素大小×索引),但是增删慢,因为可能涉及到元素的移动。 linkedlist底层基于双向链表,维护了头尾指针,因此增删快(头的),但是想要访问只能从头开始遍历,增加删除快,但是由于存储了指针,所以内存也相对占据更多。可以用来做队列和栈。

中间位置的插入删除:LinkedList只需要修改指针,ArrayList需要移动元素,(前者消耗在遍历,后者在移动),大量数据LinkedList会更快

6.说说你了解的JVM内存模型

方法区,堆

虚拟机栈,本地方法栈,程序计数器

我的博客

#面试真题#
每日一套面试真题 文章被收录于专栏

记录刷过的面试真题

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务