jjava全栈知识点[面试篇](一)
- 阻塞与等待的状态转变
- ⭐Synchronized本质上是通过什么保证线程安全的?
- volatile、synchronized和Lock如何保证可见性
- ⭐Synchronized使得同时只有一个线程可以执行,性能比较差,有什么提升的方法?
- ⭐synchronized的缺陷以及java lock如何弥补
- ⭐synchronized和Lock的对比
- synchronized的使用注意事项
- volatile关键字的作用
- ⭐32位机器共享的long和double变量为什么要用volatile
- volatile如何实现可见性和有序性
- volatile的应用场景
- final修饰的字段都是编译期常量吗?
- final可以被重载吗?
- ⭐基础数据结构
- ⭐常见的算法思想
- 常用的排序算法
- 什么是事务?
- 事务隔离等级
- ACID靠什么保证
- ⭐Buffer Poll、Redo Log Buffer、Undo log、redo log、bin log的关系
- ⭐从准备更新一条数据到事务的提交的流程
- 实现 Runnable 和 Callable是真正意义的线程吗?
- ⭐Mysql锁的类型
- Redis常用的使用场景
总结了目前主流平台中常见的面试题,标⭐为重点!
更多干货请点击 Locus-轨迹
阻塞与等待的状态转变
⭐Synchronized本质上是通过什么保证线程安全的?
加锁和释放锁的原理
可重入原理:加锁次数计数器保证:Synchronized先天具有重入性。每个对象拥有一个计数器,当线程获取该对象锁后,计数器就会加一,释放锁后就会将计数器减一。
可见性的原理:内存模型和happens-before规则
在图中每一个箭头连接的两个节点就代表之间的happens-before关系,黑色的是通过程序顺序规则推导出来,红色的为监视器锁规则推导而出:线程A释放锁happens-before线程B加锁,蓝色的则是通过程序顺序规则和监视器锁规则推测出来happens-befor关系,通过传递性规则进一步推导的happens-before关系。现在我们来重点关注2 happens-before 5,通过这个关系我们可以得出什么?根据happens-before的定义中的一条:如果A happens-before B,则A的执行结果对B可见,并且A的执行顺序先于B。线程A先对共享变量A进行加一,由2 happens-before 5关系可知线程A的执行结果对线程B可见即线程B所读取到的a的值为1。
volatile、synchronized和Lock如何保证可见性
共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。 synchronized和Lock在释放锁之前会将对变量的修改刷新到主存当中
⭐Synchronized使得同时只有一个线程可以执行,性能比较差,有什么提升的方法?
⭐synchronized的缺陷以及java lock如何弥补
⭐synchronized和Lock的对比
synchronized的使用注意事项
volatile关键字的作用
⭐32位机器共享的long和double变量为什么要用volatile
volatile如何实现可见性和有序性
volatile的应用场景
final修饰的字段都是编译期常量吗?
final可以被重载吗?
可以
⭐基础数据结构
⭐常见的算法思想
- 分治算法:将一个规模为N的问题分解为K个规模较小的子问题,相互独立且与原问题性质相同
- 动态规划算法:将待求解问题分解成若干个子问题,适用于动态规划算法求解的问题经过分解后得到的子问题往往不是相互独立的,而是下一个子阶段的求解是建立在上一个子阶段的解的基础上的。
- 贪心算法: 每次操作局部最优,最后结果是全局最优
- 二分法:要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
- 搜索算法: 主要包含BFS,DFS
- Backtracking(回溯):属于 DFS。走不通就退回再走
常用的排序算法
在综合复杂度及稳定性情况下,通常希尔, 快排和 归并需要重点掌握
什么是事务?
事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。
事务隔离等级
ACID靠什么保证
⭐Buffer Poll、Redo Log Buffer、Undo log、redo log、bin log的关系
⭐从准备更新一条数据到事务的提交的流程
实现 Runnable 和 Callable是真正意义的线程吗?
实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过 Thread 来调用。可以说任务是通过线程驱动从而执行的。
⭐Mysql锁的类型