面试题(3.27)
CAS机制
-
什么是CAS机制?
CAS全名是 Compare and Swap的缩写,翻译过来就是比较并替换。目的是为了解决在并发情况下因为线程入侵导致的数据不一致的问题。 如:ThreadPoolExceter中和ArrayList源码中有具体实现。
-
CAS机制是如何实现的?
一个简单的需求 i =0,要进行自加的操作。
执行一个方法
- 记录int b = i
- 执行逻辑
- b != i(由于在多线程的环境下i可能是会发生变化的,i是从内存中直接取出的)
- 如果等于true i自加操作失败,进行自旋操作
- 如果等于false 说明在执行逻辑中没有其他线程修改我们的i值,所以自加成功。
-
CAS是一个乐观锁
从思想上来说,synchronized属于悲观锁,悲观的认为程序中的并发情况严重,所以严防死守,CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去重试更新。
-
普通CAS机制存在ABA问题?
当一个值从A变成B,又更新回A,普通CAS机制会误判通过检测。
利用版本号比较可以有效解决ABA问题。
ArrayList
ArrayList的Iterator中采用的CAS机制
CopyOnWriteArrayList的Iterator中是Copy的方式.
ArrayList vs LinkedList
HashMap
单例模式
饿汉式
- 私有构造
- new一个private static final 对象
- pulic static 对象 getInstance 方法 获取步骤二的对象
枚举饿汉式
懒汉式
DCL懒汉式
volatile的意义:
由于CPU为了提高效率会对编译后的命令进行重排序操作,但是重排序后会导致给static共享对象赋值的时候并没有进行调用构造方法,此时如果其他线程入侵就会导致得到一个并未完全调用构造方法的对象(对象成员变量不完整),然而加volatile可以避免重排序,为了保证安全而降低了部分cpu的性能.
正常排序:
重排序后:
懒汉式(内部类)
static代码块 通过JVM保证线程安全
4315)]
懒汉式(内部类)
static代码块 通过JVM保证线程安全
[外链图片转存中…(img-m8M76UUt-1679927324316)]