美文网首页Java 杂谈Java高级架构
BAT面试必问:并发编程问题解析(含答案!)

BAT面试必问:并发编程问题解析(含答案!)

作者: 码农清风 | 来源:发表于2019-01-14 15:53 被阅读26次

    前言

    编写正确的程序并不容易,而编写正常的并发程序就更难了。相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的。

    并发编程相比 Java 中其他知识点学习起来门槛相对较高,学习起来比较费劲,从而导致很多人望而却步;而无论是职场面试和高并发高流量的系统的实现却都还离不开并发编程,从而导致能够真正掌握并发编程的人才成为市场比较迫切需求的。因此Java 并发问题也总是各个大厂面试的重点之一。在面试中,也发现很多面试者对一些基本的并发概念表示没听过,或者是原理不理解,还有的只知其一不知其二,最后导致面试失败的结果。

    在这结合一些实际中遇到的面试题和学习并发编程上的重点问题,来聊聊java并发中所需要学习的知识点。

    并发编程基础相关问题

    什么是多线程并发和并行?

    什么是线程安全问题?

    什么是共享变量的内存可见性问题?

    什么是Java中原子性操作?

    什么是Java中的CAS操作,AtomicLong实现原理?

    什么是Java指令重排序?

    Java中Synchronized关键字的内存语义是什么?

    Java中Volatile关键字的内存语义是什么?

    什么是伪共享,为何会出现,以及如何避免?

    什么是可重入锁、乐观锁、悲观锁、公平锁、非公平锁、独占锁、共享锁?

    ThreadLocal 相关问题

    讲讲ThreadLocal 的实现原理?

    ThreadLocal 作为变量的线程隔离方式,其内部是如何做的?

    说说InheritableThreadLocal 的实现原理?

    InheritableThreadLocal 是如何弥补 ThreadLocal 不支持继承的特性?

    CyclicBarrier内部的实现与 CountDownLatch 有何不同?

    随机数生成器 Random 类如何使用 CAS 算法保证多线程下新种子的唯一性?

    ThreadLocalRandom 是如何利用 ThreadLocal 的原理来解决 Random 的局限性?

    Spring 框架中如何使用 ThreadLocal 实现 request scope 作用域 Bean?

    锁相关问题

    并发包中锁的实现底层(对AQS的理解)?

    讲讲独占锁 ReentrantLock 原理?

    谈谈读写锁 ReentrantReadWriteLock 原理?

    StampedLock 锁原理的理解?

    并发队列相关问题

    谈下对基于链表的非阻塞无界队列 ConcurrentLinkedQueue 原理的理解?

    ConcurrentLinkedQueue 内部是如何使用 CAS 非阻塞算法来保证多线程下入队出队操作的线程安全?

    基于链表的阻塞队列 LinkedBlockingQueue 原理。

    阻塞队列LinkedBlockingQueue 内部是如何使用两个独占锁 ReentrantLock 以及对应的条件变量保证多线程先入队出队操作的线程安全?

    为什么不使用一把锁,使用两把为何能提高并发度?

    基于数组的阻塞队列 ArrayBlockingQueue 原理。

    ArrayBlockingQueue 内部如何基于一把独占锁以及对应的两个条件变量实现出入队操作的线程安全?

    谈谈对无界优先级队列 PriorityBlockingQueue 原理?

    PriorityBlockingQueue 内部使用堆算法保证每次出队都是优先级最高的元素,元素入队时候是如何建堆的,元素出队后如何调整堆的平衡的?

    JUC 包中线程同步器相关问题

    分析下JUC 中倒数计数器 CountDownLatch 的使用与原理?

    CountDownLatch 与线程的 Join 方法区别是什么?

    讲讲对JUC 中回环屏障 CyclicBarrier 的使用?

    CyclicBarrier内部的实现与 CountDownLatch 有何不同?

    Semaphore 的内部实现是怎样的?

    简单对比同步器实现,谈谈你的看法?

    并发组件CopyOnWriteArrayList 是如何通过写时拷贝实现并发安全的 List?

    谈谈如何系统的学习并发编程

    并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写出高效、安全可靠的多线程并发程序。学习java并发就像进入了另外一个学习领域,就像学习一门新的编程语言,或者是学习一套新的语言概念,要理解并发编程,其难度跟理解面向对象编程难度差不多。你花一点功夫,就可以理解它的基本机制,但是要想真正掌握它的本质,就需要深入的学习与理解。在这在分享一个并发编程知识的学习导图给大家!

    最后

    本文提到的一些并发编程的问题,我总结出一些面试题资料和视频资料及高清的并发编程学习思维导图免费分享在群里,还有更多关于Mysql、Spring、MyBatis、Nginx、Dubbo、Redis、Netty、Spring cloud、分布式、高并发、性能调优等架构技术资料和架构面试题资料,有需要的朋友可以来免费领取!

    资料领取方式:加QQ群930254941,进群领取资料!

    点击链接加入群聊【java架构交流群】:https://jq.qq.com/?_wv=1027&k=5vIx3dH

    相关文章

      网友评论

        本文标题:BAT面试必问:并发编程问题解析(含答案!)

        本文链接:https://www.haomeiwen.com/subject/yofjdqtx.html