前言
编写正确的程序并不容易,而编写正常的并发程序就更难了。相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的。
并发编程相比 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?
并发编程中常见的相关问题
- Logback 是如何借助队列将同步转换为异步,节省调用线程 RT 响应时间的?
- 如何避免并发组件 ConcurrentHashMap使用不当所造成程序错误并列出一些常见的出错点?
- 谈谈定时器 Timer 的时候需要注意的一些问题?
- 为什么SimpleDateFormat 是线程不安全?应该如何正确使用?
- 如何避免FutureTask 使用不当所造成调用线程一直阻塞?
- ThreadLocal为何会出现内存泄露,以及如何避免?
- ThreadLocal为何会出现内存泄露,以及如何避免?
谈谈如何系统的学习并发编程
并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写出高效、安全可靠的多线程并发程序。学习java并发就像进入了另外一个学习领域,就像学习一门新的编程语言,或者是学习一套新的语言概念,要理解并发编程,其难度跟理解面向对象编程难度差不多。你花一点功夫,就可以理解它的基本机制,但是要想真正掌握它的本质,就需要深入的学习与理解。在这在分享一个并发编程知识的学习导图给大家!
最后
觉得可以的朋友可以分享,本文提到的一些并发编程的问题
都整理在我的架构圈子里面
大牛整理了以下架构师必备的资料
后台私信回复“666”即可马上获得!
最后,希望你做一个爱思考,懂思考,会思考的程序员。