面试题(3.27)

面试题(3.27)

CAS机制

  1. 什么是CAS机制?

    CAS全名是 Compare and Swap的缩写,翻译过来就是比较并替换。目的是为了解决在并发情况下因为线程入侵导致的数据不一致的问题。 如:ThreadPoolExceter中和ArrayList源码中有具体实现。

  2. CAS机制是如何实现的?

    一个简单的需求 i =0,要进行自加的操作。

    执行一个方法

    • 记录int b = i
    • 执行逻辑
    • b != i(由于在多线程的环境下i可能是会发生变化的,i是从内存中直接取出的)
    • 如果等于true i自加操作失败,进行自旋操作
    • 如果等于false 说明在执行逻辑中没有其他线程修改我们的i值,所以自加成功。
  3. CAS是一个乐观锁

    从思想上来说,synchronized属于悲观锁,悲观的认为程序中的并发情况严重,所以严防死守,CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去重试更新。

  4. 普通CAS机制存在ABA问题?

    当一个值从A变成B,又更新回A,普通CAS机制会误判通过检测。

    利用版本号比较可以有效解决ABA问题。

ArrayList

  1. ArrayList的扩容机制

    image-20230327140648867

  2. fail-fast和fail-safe

    image-20230327141115890

image-20230327141335228

ArrayList的Iterator中采用的CAS机制

CopyOnWriteArrayList的Iterator中是Copy的方式.

ArrayList vs LinkedList

image-20230327142530776

image-20230327142510455

HashMap

单例模式

饿汉式

  • 私有构造
  • new一个private static final 对象
  • pulic static 对象 getInstance 方法 获取步骤二的对象

image-20230327155953789

枚举饿汉式

image-20230327161532879

懒汉式

image-20230327163057262

DCL懒汉式

image-20230327163141325

volatile的意义:

由于CPU为了提高效率会对编译后的命令进行重排序操作,但是重排序后会导致给static共享对象赋值的时候并没有进行调用构造方法,此时如果其他线程入侵就会导致得到一个并未完全调用构造方法的对象(对象成员变量不完整),然而加volatile可以避免重排序,为了保证安全而降低了部分cpu的性能.

正常排序:

image-20230327170011329

重排序后:

image-20230327170048071

懒汉式(内部类)

static代码块 通过JVM保证线程安全

image-20230327222631680

4315)]

懒汉式(内部类)

static代码块 通过JVM保证线程安全

[外链图片转存中…(img-m8M76UUt-1679927324316)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值