JUC第一讲:Java并发知识体系详解 + 面试题汇总(P6熟练 P7精通)

简介: JUC第一讲:Java并发知识体系详解 + 面试题汇总(P6熟练 P7精通)

1、JUC学习建议

1.1、为什么学习 JUC?

  • JUC就是 java.util .concurrent 工具包的简称。这是一个处理线程的工具包, JDK1.5 开始出现的。它加了一些在并发编程中常用的工具类,用于定义类似线程的自定义子系统,包括线程池,异步io,轻量级任务框架等。
  • JUC 在面试中重要程度上:在当前 Java 后端面试中,JUC所有框架/中间件中被问到频率是次高的

1.2、学习的建议

  • 1、阅读源码。读源码其实也是一种实战锻炼,可以帮助你从代码逻辑中彻底理解 JUC 实际运行机制。当遇到问题时,可以直接从代码层面进行定位、分析和解决问题
  • 2、亲自动手实践
  • 在开发中,使用并体会其特性
  • 3、学习的路线
  • JUC知识体系
  • 多线程的一些概念(进程、线程、并行、并发啥的,谈谈你对高并发的认识)
  • Java 内存模型相关(也可以算是 JVM 的范畴)
  • 同步机制(locks、synchronzied、atomic)
  • 并发容器类
  • ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArraySet
  • 阻塞队列(顺着就会问到线程池)
  • 线程池(Executor、Callable 、Future、ExecutorService等等,底层原理)
  • AQS
  • AQS 原理
  • 工具类:CountDownLatch、ReentrantLock、Semaphore、Exchanger
  • atomic 类(atomic常用类,方法,到 CAS,或者 ABA问题)
  • Fork/Join并行计算框架
  • 异步编排 CompletableFuture

1.3、JUC 学习资料

书籍推荐

  • 1、《Java并发编程实战》作者阵容可谓大师云集,也包括Doug Lea(基础篇)
  • 2、《Java并发编程的艺术》讲解并发包内部实现原理,能读明白,内功大增(高段位)
  • 3、《图解Java多线程设计模式》并发编程设计模式方面的经典书籍
  • 4、《操作系统:精髓与设计原理》经典操作系统教材
  • 5、http://ifeve.com 国内专业并发编程网站
  • 6、http://www.cs.umd.edu/~pugh/java/memoryModel/ 很多并发编程的早期资料都在这里
  • 7、极客时间 - Java 并发编程实战 王宝令
  • 8、尚硅谷2022版 JUC并发编程 周阳

1.4、使用过并发包中的那些工具

1、CocurrentHashMap 怎么保证线程安全?CocurrentHashMap 在 JDK 1.8 前后的锁有什么区别?CocurrentHashMap 在 JDK 1.8 有什么改变?
  • ConcurrentHashMap线程安全的map接口,初始化大小1 数据接口
  • 底层实现使用数组+链表+红黑树
  • 如何扩容:采用多线程并发扩容,给当前扩容线程分配“一个步长”的节点数
  • 多线程环境下,保证线程安全
  • 1.7 和 1.8 区别
  • 1.7 数组+链表 线程安全:分段锁Segment,继承了ReentrantLock)
  • 1.8 数组+链表+红黑树 线程安全:CAS + Synchronized 优化点:降低了锁的粒度
  • size 统计:
  • 1.7 先尝试在不加锁的情况下尝进行统计 size,最多统计3次
  • 1.8 直接统计 baseCount 和 counterCells 的 value 值,返回的是一个近似值
  • 不要使用这个值做业务逻辑
2、线程池使用的是哪种?线程池参数怎么配置?线程池各个参数的作用?线程池的参数配置要注意什么?线程池的工作流程
  • 使用ThreadPoolExecutor创建线程池,而不是Executors,明确线程池的运行规则
  • 所有需要多线程的使用场景,都是通过线程池提供的
  • 问了线程池7大参数含义,线程池大小配置多少合适?
  • 配置对线程池的监控 getTaskCount getPoolSize
3、JDK 中的并发类知道哪些?介绍下 CountDownLatch 和 CyclicBarrier?
  • 使用atomic类,①计算任务执行个数,②统计缓存命中率,可以保证 i++ 的原子操作
  • 使用countdownlatch 闭锁 异步转同步操作
  • 可被多个线程并发的实现减1操作,并在计数器为0后调用await方法的线程被唤醒,从而实现多线程间的协作
  • 用于复杂对象组装:商品信息、属性信息
  • 使用异步编排 CompletableFuture 优化商品详情页等场景
  • 可组合:可以将多个依赖操作通过不同的方式进行编排,例如CompletableFuture提供thenCompose、thenCombine等各种then开头的方法,这些方法就是对“可组合”特性的支持。
  • CompletableFuture实现了两个接口:Future、CompletionStage。Future表示异步计算的结果,CompletionStage用于表示异步执行过程中的一个步骤(Stage),这个步骤可能是由另外一个CompletionStage触发的,随着当前步骤的完成,也可能会触发其他一系列CompletionStage的执行。从而我们可以根据实际业务对这些步骤进行多样化的编排组合
  • 这种方式类似“观察者模式”,依赖动作(Dependency Action)都封装在一个单独Completion子类中
  • CompletableFuture支持很多回调方法,例如thenAccept、thenApply、exceptionally等,这些方法接收一个函数类型的参数f,生成一个Completion类型的对象(即观察者),并将入参函数f赋值给Completion的成员变量fn,然后检查当前CF是否已处于完成状态(即result != null),如果已完成直接触发fn,否则将观察者Completion加入到CF的观察者链stack中,再次尝试触发,如果被观察者未执行完则其执行完毕之后通知触发。
4、AQS 的底层原理?
  • AQS(AbstractQueuedSynchronizer)是一个用于构建锁和同步器的框架,许多同步器都可以通过AQS 很容易并且高效地构造出来
  • 通过内置的FIFO双向队列( CLH) 来完成资源获取线程的排队工作,并通过一个int类型变量表示持有锁的状态
  • 可以粗略这样认为:int类型的 state表示锁的状态,是否抢占到了锁
  • 没有获取到锁的放到双向队列里面去,使用到的数据结构 CLH
5、使用过哪些锁?介绍下悲观锁和乐观锁?synchronized 和 Lock 的区别、使用场景?synchronized 原理?synchronized 作用于静态方法、普通方法、this、Lock.class 的区别?为什么引入偏向锁、轻量级锁,介绍下升级流程?介绍下 CAS,存在什么问题?死锁的必要条件,如何预防死锁?
  • 悲观锁
  • synchronized 和 Lock
  • synchronized 原理?
  • synchronized 修饰代码块时,编译后会生成 monitorenter 和 monitorexit 指令,分别对应进入同步块和退出同步块
  • Synchronized的语义底层是通过一个monitor(监视器锁)对象来完成的,当monitor被占用时处于锁定状态
  • 线程执行monitorenter指令时尝试获取monitor的所有权:
  • 1、如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor的所有者。
  • 2、如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数+1.
  • 3、如果其他线程已经占用monitor,该线程进入阻塞状态,直到monitor的进入数为0,再尝试获取monitor的所有权
  • synchronized 修饰方法时,编译后会生成 ACC_SYNCHRONIZED 标记,当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了则会先尝试获得锁。
  • 为什么引入偏向锁、轻量级锁,介绍下升级流程?
  • 当JVM检测到不同的竞争状况时,会自动切换到适合的锁实现,这种切换就是锁的升级、降级(分4个场景)
  • 场景1 无竞争:当没有竞争出现时,默认会使用偏向锁
  • 场景2 偏向锁做了啥:很多应用场景中,大部分对象生命周期中最多会被一个线程锁定,使用偏向锁可以降低无竞争开销。JVM会利用CAS操作(compare and swap),在对象头上的Mark Word部分设置线程ID,以表示这个对象偏向于当前线程,所以并不涉及真正的互斥锁
  • 场景3 有竞争:如果有另外的线程试图锁定某个已经被偏向过的对象,JVM就需要撤销(revoke)偏向锁,并切换到轻量级锁实现轻量级锁依赖CAS操作Mark Word来试图获取锁,如果重试成功,就使用普通的轻量级锁;场景4,竞争失败锁升级:否则,进一步升级为重量级锁。
  • 锁的降级:锁降级确实是会发生的,当JVM进入安全点(SafePoint 由oopMap实现)的时候,会检查是否有闲置的Monitor,然后试图进行降级
  • 乐观锁
  • volatile
  • 使用volatile关键字 保证内存可见性
  • 在双重校验获取单例时使用该关键字
  • 获取apollo配置时,使用volatile
  • CAS
  • 是一种硬件对并发的支持,用于管理对共享数据的访问。相当于是无锁的非阻塞实现
  • CAS包含3个操作数:内存值V,旧的预估值A,即将被更新的目标值B,当且仅当内存值V等于旧的预估值A,将内存地址V的值修改为B;否则,不做任何操作
  • CAS乐观锁的缺点三大问题:
  • 1、ABA问题 使用带时间戳的类解决这个问题
  • 2、循环时间长开销大
  • 3、只能保证一个共享变量的原子操作
6、ThreadLocal,存在什么问题?
  • 使用ThreadLocal 提供了线程局部变量,在多线程环境下,访问时能够保证各个线程里变量的独立性
  • 在Spring切面编程中的使用,将前置逻辑中获取到的数据放入ThreadLocal中,然后在后置处理逻辑中作为入参传入,最后在finally语句中执行remove操作,防止内存泄漏
  • 内存泄漏问题:使用了弱引用作为 Entry 的 key,如果当前线程一直在运行,并且一直不执行get、set、remove方法,导致了value一直处于强引用链路中
  • InheritableThreadLocal子线程可以拿到父线程的值。
  • 原理即是在Thread初始化时进行父线程inheritableThreadLocals变量的拷贝
  • 缺点:JDK提供的ThreadLocal不能支持线程池中,线程执行时的父子线程数据传递的问题
  • 阿里TTL
  • 在日志系统中,使用阿里TTL解决线程池内父子线程数据传递问题
  • 其内部存储了一个InheritableThreadLocal类型的holder,且使用WeakHashMap来进行弱指针引用,在run过程中会先进行上文Snapshot捕获(即父线程ThreadLocal内容),捕获后的Snapshot再回放: 如当前执行线程,达到线程池内线程执行时,父子线程上下文传递的效果

2、相关文章

2.1、Java 并发基础

首先全局的了解并发的知识体系,同时了解并发理论基础和线程基础,并发关键字等,这些是你理解Java并发框架的基础。

  • 多线程的出现是要解决什么问题的?
  • 线程不安全是指什么? 举例说明
  • 并发出现线程不安全的本质什么? 可见性,原子性和有序性。
  • Java是怎么解决并发问题的? 3个关键字,JMM和8个Happens-Before
  • 线程安全是不是非真即假? 不是
  • 线程安全有哪些实现思路?
  • 如何理解并发和并行的区别?
  • 线程有哪几种状态? 分别说明从一种状态到另一种状态转变有哪些方式?
  • 通常线程有哪几种使用方式?
  • 基础线程机制有哪些?
  • 线程的中断方式有哪些?
  • 线程的互斥同步方式有哪些? 如何比较和选择?
  • 线程之间有哪些协作方式?
  • Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。
  • Synchronized可以作用在哪里? 分别通过对象锁和类锁进行举例。
  • Synchronized本质上是通过什么保证线程安全的? 分三个方面回答:加锁和释放锁的原理,可重入原理,保证可见性原理。
  • Synchronized由什么样的缺陷? Java Lock是怎么弥补这些缺陷的。
  • Synchronized和Lock的对比,和选择?
  • Synchronized在使用时有何注意事项?
  • Synchronized修饰的方法在抛出异常时,会释放锁吗?
  • 多个线程等待同一个Synchronized锁的时候,JVM如何选择下一个获取锁的线程?
  • Synchronized使得同时只有一个线程可以执行,性能比较差,有什么提升的方法?
  • 我想更加灵活地控制锁的释放和获取(现在释放锁和获取锁的时机都被规定死了),怎么办?
  • 什么是锁的升级和降级? 什么是JVM里的偏斜锁、轻量级锁、重量级锁?
  • 不同的JDK中对Synchronized有何优化?
  • volatile关键字的作用是什么?
  • volatile能保证原子性吗?
  • 之前32位机器上共享的long和double变量的为什么要用volatile? 现在64位机器上是否也要设置呢?
  • i++为什么不能保证原子性?
  • volatile是如何实现可见性的? 内存屏障。
  • volatile是如何实现有序性的? happens-before等
  • 说下volatile的应用场景?
  • 所有的final修饰的字段都是编译期常量吗?
  • 如何理解private所修饰的方法是隐式的final?
  • 说说final类型的类如何拓展? 比如String是final类型,我们想写个MyString复用所有String中方法,同时增加一个新的toMyString()的方法,应该如何做?
  • final方法可以被重载吗? 可以
  • 父类的final方法能不能够被子类重写? 不可以
  • 说说final域重排序规则?
  • 说说final的原理?
  • 使用 final 的限制条件和局限性?

2.2、JUC框架详解

需要对JUC框架五大类详细解读,包括:Lock框架,并发集合,原子类,线程池和工具类。

  • JUC框架包含几个部分?
  • 每个部分有哪些核心的类?
  • 最最核心的类有哪些?

JUC框架:CAS及原子类:从最核心的CAS, Unsafe和原子类开始分析。

  • 线程安全的实现方法有哪些?
  • 什么是CAS?
  • CAS使用示例,结合AtomicInteger给出示例?
  • CAS会有哪些问题?
  • 针对这这些问题,Java提供了哪几个解决的?
  • AtomicInteger底层实现? CAS+volatile
  • 请阐述你对Unsafe类的理解?
  • 说说你对Java原子类的理解? 包含13个,4组分类,说说作用和使用场景。
  • AtomicStampedReference是什么?
  • AtomicStampedReference是怎么解决ABA的? 内部使用Pair来存储元素值及其版本号
  • java中还有哪些类可以解决ABA的问题? AtomicMarkableReference

JUC框架:锁:然后分析JUC中锁。

  • 为什么LockSupport也是核心基础类? AQS框架借助于两个类:Unsafe(提供CAS操作)和LockSupport(提供park/unpark操作)
  • 写出分别通过wait/notify和LockSupport的park/unpark实现同步?
  • LockSupport.park()会释放锁资源吗? 那么Condition.await()呢?
  • Thread.sleep()、Object.wait()、Condition.await()、LockSupport.park()的区别? 重点
  • 如果在wait()之前执行了notify()会怎样?
  • 如果在park()之前执行了unpark()会怎样?
  • 什么是AQS? 为什么它是核心?
  • AQS的核心思想是什么? 它是怎么实现的? 底层数据结构等
  • AQS有哪些核心的方法?
  • AQS定义什么样的资源获取方式? AQS定义了两种资源获取方式:独占(只有一个线程能访问执行,又根据是否按队列的顺序分为公平锁非公平锁,如ReentrantLock) 和共享(多个线程可同时访问执行,如SemaphoreCountDownLatchCyclicBarrier )。ReentrantReadWriteLock可以看成是组合式,允许多个线程同时对某一资源进行读。
  • AQS底层使用了什么样的设计模式? 模板
  • AQS的应用示例?
  • 什么是可重入,什么是可重入锁? 它用来解决什么问题?
  • ReentrantLock的核心是AQS,那么它怎么来实现的,继承吗? 说说其类内部结构关系。
  • ReentrantLock是如何实现公平锁的?
  • ReentrantLock是如何实现非公平锁的?
  • ReentrantLock默认实现的是公平还是非公平锁?
  • 使用ReentrantLock实现公平和非公平锁的示例?
  • ReentrantLock和Synchronized的对比?
  • 为了有了ReentrantLock还需要ReentrantReadWriteLock?
  • ReentrantReadWriteLock底层实现原理?
  • ReentrantReadWriteLock底层读写状态如何设计的? 高16位为读锁,低16位为写锁
  • 读锁和写锁的最大数量是多少?
  • 本地线程计数器ThreadLocalHoldCounter是用来做什么的?
  • 缓存计数器HoldCounter是用来做什么的?
  • 写锁的获取与释放是怎么实现的?
  • 读锁的获取与释放是怎么实现的?
  • RentrantReadWriteLock为什么不支持锁升级?
  • 什么是锁的升降级? RentrantReadWriteLock为什么不支持锁升级?

JUC框架:集合:再理解JUC中重要的支持并发的集合。

  • 为什么HashTable慢? 它的并发度是什么? 那么ConcurrentHashMap并发度是什么?
  • ConcurrentHashMap在JDK1.7和JDK1.8中实现有什么差别? JDK1.8解決了JDK1.7中什么问题
  • ConcurrentHashMap JDK1.7实现的原理是什么? 分段锁机制
  • ConcurrentHashMap JDK1.8实现的原理是什么? 数组+链表+红黑树,CAS
  • ConcurrentHashMap JDK1.7中Segment数(concurrencyLevel)默认值是多少? 为何一旦初始化就不可再扩容?
  • ConcurrentHashMap JDK1.7说说其put的机制?
  • ConcurrentHashMap JDK1.7是如何扩容的? rehash(注:segment 数组不能扩容,扩容是 segment 数组某个位置内部的数组 HashEntry<K,V>[] 进行扩容)
  • ConcurrentHashMap JDK1.8是如何扩容的? tryPresize
  • ConcurrentHashMap JDK1.8链表转红黑树的时机是什么? 临界值为什么是8?
  • ConcurrentHashMap JDK1.8是如何进行数据迁移的? transfer
  • 请先说说非并发集合中Fail-fast机制?
  • 再为什么说ArrayList查询快而增删慢?
  • 对比ArrayList说说CopyOnWriteArrayList的增删改查实现原理? COW基于拷贝
  • 再说下弱一致性的迭代器原理是怎么样的? COWIterator<E>
  • CopyOnWriteArrayList为什么并发安全且性能比Vector好?
  • CopyOnWriteArrayList有何缺陷,说说其应用场景?
  • 要想用线程安全的队列有哪些选择? Vector,Collections.synchronizedList( List<T> list), ConcurrentLinkedQueue等
  • ConcurrentLinkedQueue实现的数据结构?
  • ConcurrentLinkedQueue底层原理? 全程无锁(CAS)
  • ConcurrentLinkedQueue的核心方法有哪些? offer(),poll(),peek(),isEmpty()等队列常用方法
  • 说说ConcurrentLinkedQueue的HOPS(延迟更新的策略)的设计?
  • ConcurrentLinkedQueue适合什么样的使用场景?
  • 什么是BlockingDeque?
  • BlockingQueue大家族有哪些? ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, SynchronousQueue…
  • BlockingQueue适合用在什么样的场景?
  • BlockingQueue常用的方法?
  • BlockingQueue插入方法有哪些? 这些方法(add(o),offer(o),put(o),offer(o, timeout, timeunit))的区别是什么?
  • BlockingDeque 与BlockingQueue有何关系,请对比下它们的方法?
  • BlockingDeque适合用在什么样的场景?
  • BlockingDeque大家族有哪些?
  • BlockingDeque 与BlockingQueue实现例子?

JUC框架:线程池:再者分析JUC中非常常用的线程池等。

  • FutureTask用来解决什么问题的? 为什么会出现?
  • FutureTask类结构关系怎么样的?
  • FutureTask的线程安全是由什么保证的?
  • FutureTask结果返回机制?
  • FutureTask内部运行状态的转变?
  • FutureTask通常会怎么用? 举例说明。
  • 为什么要有线程池?
  • Java是实现和管理线程池有哪些方式? 请简单举例如何使用。
  • 为什么很多公司不允许使用Executors去创建线程池? 那么推荐怎么使用呢?
  • ThreadPoolExecutor有哪些核心的配置参数? 请简要说明
  • ThreadPoolExecutor可以创建哪是哪三种线程池呢?
  • 当队列满了并且worker的数量达到maxSize的时候,会怎么样?
  • 说说ThreadPoolExecutor有哪些RejectedExecutionHandler策略? 默认是什么策略?
  • 简要说下线程池的任务执行机制? execute –> addWorker –>runworker (getTask)
  • 线程池中任务是如何提交的?
  • 线程池中任务是如何关闭的?
  • 在配置线程池的时候需要考虑哪些配置因素?
  • 如何监控线程池的状态?
  • ScheduledThreadPoolExecutor要解决什么样的问题?
  • ScheduledThreadPoolExecutor相比ThreadPoolExecutor有哪些特性?
  • ScheduledThreadPoolExecutor有什么样的数据结构,核心内部类和抽象类?
  • ScheduledThreadPoolExecutor有哪两个关闭策略? 区别是什么?
  • ScheduledThreadPoolExecutor中scheduleAtFixedRate 和 scheduleWithFixedDelay区别是什么?
  • 为什么ThreadPoolExecutor 的调整策略却不适用于 ScheduledThreadPoolExecutor?
  • Executors 提供了几种方法来构造 ScheduledThreadPoolExecutor?
  • Fork/Join主要用来解决什么样的问题?
  • Fork/Join框架是在哪个JDK版本中引入的?
  • Fork/Join框架主要包含哪三个模块? 模块之间的关系是怎么样的?
  • ForkJoinPool类继承关系?
  • ForkJoinTask抽象类继承关系? 在实际运用中,我们一般都会继承 RecursiveTask 、RecursiveAction 或 CountedCompleter 来实现我们的业务需求,而不会直接继承 ForkJoinTask 类。
  • 整个Fork/Join 框架的执行流程/运行机制是怎么样的?
  • 具体阐述Fork/Join的分治思想和work-stealing 实现方式?
  • 有哪些JDK源码中使用了Fork/Join思想?
  • 如何使用Executors工具类创建ForkJoinPool?
  • 写一个例子: 用ForkJoin方式实现1+2+3+…+100000?
  • Fork/Join在使用时有哪些注意事项? 结合JDK中的斐波那契数列实例具体说明。

JUC框架:工具类:最后来看下JUC中有哪些工具类,以及线程隔离技术ThreadLocal。

  • 什么是CompletableFuture?
  • CompletableFuture的底层实现原理?
  • CompletableFuture对函数式编程的使用?
  • CompletableFuture如何解决“回调地狱”的问题?
  • 什么是CountDownLatch?
  • CountDownLatch底层实现原理?
  • CountDownLatch一次可以唤醒几个任务? 多个
  • CountDownLatch有哪些主要方法? await(),countDown()
  • CountDownLatch适用于什么场景?
  • 写道题:实现一个容器,提供两个方法,add,size 写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束? 使用CountDownLatch 代替wait notify 好处。
  • 什么是CyclicBarrier?
  • CyclicBarrier底层实现原理?
  • CountDownLatch和CyclicBarrier对比?
  • CyclicBarrier的核心函数有哪些?
  • CyclicBarrier适用于什么场景?
  • 什么是Semaphore?
  • Semaphore内部原理?
  • Semaphore常用方法有哪些? 如何实现线程同步和互斥的?
  • Semaphore适合用在什么场景?
  • 单独使用Semaphore是不会使用到AQS的条件队列?
  • Semaphore中申请令牌(acquire)、释放令牌(release)的实现?
  • Semaphore初始化有10个令牌,11个线程同时各调用1次acquire方法,会发生什么?
  • Semaphore初始化有10个令牌,一个线程重复调用11次acquire方法,会发生什么?
  • Semaphore初始化有1个令牌,1个线程调用一次acquire方法,然后调用两次release方法,之后另外一个线程调用acquire(2)方法,此线程能够获取到足够的令牌并继续运行吗?
  • Semaphore初始化有2个令牌,一个线程调用1次release方法,然后一次性获取3个令牌,会获取到吗?
  • Phaser主要用来解决什么问题?
  • Phaser与CyclicBarrier和CountDownLatch的区别是什么?
  • 如果用CountDownLatch来实现Phaser的功能应该怎么实现?
  • Phaser运行机制是什么样的?
  • 给一个Phaser使用的示例?
  • Exchanger主要解决什么问题?
  • 对比SynchronousQueue,为什么说Exchanger可被视为 SynchronousQueue 的双向形式?
  • Exchanger在不同的JDK版本中实现有什么差别?
  • Exchanger实现机制?
  • Exchanger已经有了slot单节点,为什么会加入arena node数组? 什么时候会用到数组?
  • arena可以确保不同的slot在arena中是不会相冲突的,那么是怎么保证的呢?
  • 什么是伪共享,Exchanger中如何体现的?
  • Exchanger实现举例
  • 什么是ThreadLocal? 用来解决什么问题的?
  • 说说你对ThreadLocal的理解
  • ThreadLocal是如何实现线程隔离的?
  • 为什么ThreadLocal会造成内存泄露? 如何解决
  • 还有哪些使用ThreadLocal的应用场景?

2.3、Java 并发本质与模式

最后站在更高的角度看其本质(协作,分工和互斥),同时总结上述知识点所使用的模式。

3、参考文档

相关文章
|
3月前
|
安全 Java API
JAVA并发编程JUC包之CAS原理
在JDK 1.5之后,Java API引入了`java.util.concurrent`包(简称JUC包),提供了多种并发工具类,如原子类`AtomicXX`、线程池`Executors`、信号量`Semaphore`、阻塞队列等。这些工具类简化了并发编程的复杂度。原子类`Atomic`尤其重要,它提供了线程安全的变量更新方法,支持整型、长整型、布尔型、数组及对象属性的原子修改。结合`volatile`关键字,可以实现多线程环境下共享变量的安全修改。
|
27天前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
53 4
|
2月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
2月前
|
Java 应用服务中间件 程序员
JVM知识体系学习八:OOM的案例(承接上篇博文,可以作为面试中的案例)
这篇文章通过多个案例深入探讨了Java虚拟机(JVM)中的内存溢出问题,涵盖了堆内存、方法区、直接内存和栈内存溢出的原因、诊断方法和解决方案,并讨论了不同JDK版本垃圾回收器的变化。
34 4
|
2月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
89 2
|
3月前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
3月前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
191 6
【Java学习】多线程&JUC万字超详解
|
2月前
|
存储 安全 Java
Java基础-基础知识体系小结 Q/A
Java基础-基础知识体系小结 Q/A
15 0