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在释放锁之前会将对变量的修改刷新到主存当中