京东数科面经(2021年1月13日上午11点)
面试官人挺好的,整个过程挺耐心听我讲并且还会和我一起分析,一次很有收获的面试经历。
面试总时长:43分钟
-
自我介绍
(没有聊项目…可能看技术栈太简单了)
-
直接问说说你了解JVM哪些东西?
答:不了解
-
一个关于TCP/IP的问题
答:不会(没太听清楚,这块也没准备,就直接说不会了)
根据简历写了熟悉多线程,然后一顿问…
-
了解过CAS嘛?
答:√
CAS(Compare-and-Swap),即比较并替换,是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技术。
CAS操作需要依赖于Unsafe类的方法。Unsafe类中所有方法都是native修饰,所有方法都是直接调用操作系统底层资源执行任务的。CAS是一条CPU并发原语,而在操作系统中,原语的执行必修是连续的,在执行过程中不允许中断,也就说CAS是一条原子指令.
CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。
CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。
-
CAS会有什么缺点?
答:√ 我说了三个
1.死循环影响性能
2.只能保证一个共享变量的原子性
3.ABA问题
-
那你能说下ABA问题嘛?
答:√ 有进行简单描述,不过我还举了个实例说明。
CAS流程通常如下:
- 首先从地址V读取A
- 根据A计算目标值B
- 通过CAS以原子的方式将地址V中的值从A修改为B
在第1步中读取的值是A,并且在第3步修改成功了,我们就能说它的值在第1步和第3步之间没有被其他线程改变过了吗?
如果在这段期间它的值曾经被改成了B,后来又被改回为A,那CAS操作就会误认为它从来没有被改变过。这个漏洞称为CAS操作的“ABA”问题。
-
怎么解决ABA问题?
答:√
Java并发包为了解决这个问题,提供了一个带有标记的原子引用类“AtomicStampedReference”,它可以通过控制变量值的版本来保证CAS的正确性。因此,在使用CAS前要考虑清楚“ABA”问题是否会影响程序并发的正确性,如果需要解决ABA问题,改用传统的互斥同步可能会比原子类更高效。
-
那你用原子引用AtmoicRefence解释下刚刚那个例子,怎么解决的?
答:半√吧 我觉得没答到点上,后来想了一下,应该是想引诱我到这个也不能完全解决ABA问题,最终解决是用AtomicStampRefence引入版本号机制(我是傻逼…)
JDK 中 java.util.concurrent.atomic 并发包下,提供了 AtomicStampedReference,通过为引用建立个 Stamp 类似版本号的方式,能很好的解决CAS机制中的ABA问题
读源码&#x