写点什么

和面试官聊 1 小时 Java 并发,多亏 GitHub 上这份笔记

  • 2023-04-26
    湖南
  • 本文字数:1396 字

    阅读完需:约 5 分钟

面试过程

面试官:你知道 CAS 吗,能跟我讲讲吗?

我:CAS(Compare And Swap),比较并交换。整个 AQS 同步组件,Atomic 原子类操作等等都是基于 CAS 实现的,甚至 ConcurrentHashMap 在 JDK1.8 版本中,也调整为 CAS+synchronized。可以说,CAS 是整个 JUC 的基石。


CAS 的实现方式其实不难。在 CAS 中有三个参数:内存值 V、旧的预期值 A、要更新的值 B,当且仅当内存值 V 的值等于旧的预期值 A 时,才会将内存值 V 的值修改为 B,否则什么也不干,是一种乐观锁。其它代码如下:

我:接着我举了个 AtomicInteger 的例子,来给面试官阐述 CAS 的实现。

面试官:那 CAS 有什么缺陷吗?

我:CAS 虽然高效的解决了原子问题,但是还是存在一些缺陷的,主要体现在三个方面:

  • 1.循环时间太长:如果自旋 CAS 长时间不成功,则会给 CPU 带来非常大的开销,在 JUC 中,有些地方就会限制 CAS 自旋的次数。

  • 2.只能保证一个共享变量原子操作:看了 CAS 的实现就知道这只能针对一个共享变量,如果是多个共享变量就只能使用锁了。或者把多个变量整成一个变量也可以用 CAS。

  • 3.ABA 问题:CAS 需要检查操作值有没有发生改变,如果没有发生改变则更新,但是存在这样一种情况:如果一个值原来是 A,变成了 B,然后又变成了 A,那么在 CAS 检查的时候会发现没有改变,但是实质上它已经发生了改变,这就是所谓的 ABA 问题。对于 ABA 问题的解决方案是加上版本号,即在每个变量都加上一个版本号,每次改变时加 1,即 A->B->A,变成 1A->2B->3A。例如原子类中 AtomicInteger 会发生 ABA 问题,使用 AtomicStampedReference 可以解决 ABA 问题。


面试官:你能说下轻量级锁吗?

面试官:你先说下你对 synchronized 的了解。

面试官:什么是原子操作?

面试官:什么是 Executors 框架?

面试官:什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?

面试官:CycliBarriar 和 CountdownLatch 有什么区别?

面试官:Java 中用到的线程调度算法是什么?

我: 淦,年轻人不讲武德

总结

面试的时候,开口第一句,面试官就知道你的水平了。你很多东西用过,但是并不懂底层原理,面试官一问,你就哑火了… 并发编程中涉及到的知识点其实挺多,工作多年的程序员,应该掌握哪些技术?如何才能在大厂面试中侃侃而谈,在无数竞争对手中脱颖而出?


为了给在工作和技术上遇到瓶颈的小伙伴找到发展方向,彻底要把这块技术掌握好,分享这些并发学习笔记手册及真题解析(彩图版)给有需要的小伙伴,这些学习资源都对 Java 并发核心解析得很透彻,还结合了面试真题。


限于文章篇幅原因,只能以截图的形式展示出来,有需要的小伙伴 点击这里凭本文截图即可获取!

目录概览

内容节选

并发编程三个核心问题


并发编程三大特性


利用 Happens-Before 原则解决可见性、有序性问题


利用互斥锁解决原子性问题


面试常问的 Volatile


如何用一把锁保护多个资源?


如何避免死锁?


volatile 和 synchronized 到底啥区别?


线程的生命周期


面试被问创建多少个线程合适该怎么说?


手动创建线程很简单,为什么要使用线程池?


等待、通知机制


贯穿并发编程的中断机制


图解 AQS(独占式)以吸 ReentrantLock


图解 AQS(共享式)以及 Semaphore


小学数学搞定 ReentrantReadWriteLock


一网打尽 CountDownLatch 和 CyclicBarrier


会用 Java Future,你泡茶也很快


CompletableFuture 用串行方式搞定并发编程


既生 ExecutorService 何生 CompletionService ?


分分钟搞定 Java 并发队列


ForkJoinPool 大剖析

限于文章篇幅原因,就展示到这里了,有需要的小伙伴 点击这里凭本文截图即可获取!

用户头像

还未添加个人签名 2021-07-28 加入

公众号:该用户快成仙了

评论

发布
暂无评论
和面试官聊1小时Java并发,多亏GitHub上这份笔记_Java_做梦都在改BUG_InfoQ写作社区