JUC并发编程
文章平均质量分 84
JUC并发编程
庄小焱
我是庄小焱,阿里巴巴Java高级工程师、PMP项目管理专家、系统架构设计师(高级)、CSDN博文专家。 博主在微服务、虚拟化、系统架构、大数据、机器学习领域不断学习,同时在博客中分享自己学习知识和相关技术, 欢迎大家和我交流学习,欢迎大家关注我的博客。
展开
-
并发编程——JUC并发面试问题
现如今,不管是应届毕业生还是工作三五年的工程师,在面试招聘的时候JUC并发编程是必须掌握的一个技能,否者你的面试结果可能会很差。本博文主要是整理JUC相关面试问题和答案。帮助大家在面试过程中能够回答面试官问题。本人将不断更新的JUC并发编程的相关面试问题。帮助小伙伴更好通过面试。原创 2021-05-10 22:02:20 · 3007 阅读 · 0 评论 -
并发编程——JUC知识脑图
摘要并发编程在软件编程中尤为突出和重要,在当今面试或工作中也是不可缺少的。作为一名高级java开发工程师,并发编程的技能已经成为了重要的一项。本博文将详细介绍并发编程中的知识点和知识脑图,帮助大家更好的学习和使用的并发编程。一、并发编程知识脑图二、并发编程知识详细解析2.1 JUC并发编程知识脑图并发编程——知识脑图_庄小焱的博客-CSDN博客2.2 JUC并发大厂面试问题并发编程——JUC并发大厂面试问题_庄小焱的博客-CSDN博客_并发编程常见问题2.3 JU原创 2022-05-16 10:59:00 · 985 阅读 · 6 评论 -
并发编程——Lock原理
在java并发编程中涉及到最多的就是锁机制。锁是解决并发问题的重要手段。本博文将详细介绍java中锁的相关原理与相关知识,帮助大家更好的在并发编程中使用相关锁来解决。原创 2021-04-08 18:53:10 · 282 阅读 · 0 评论 -
并发编程——synchronized原理
摘要在JUC并发编程中synchronized关键字具有非常重要的作用,同时JDK中大量的应用。synchronized,即俗称的对象锁,它采用互斥的方式让同一时刻至多只有一个线程能持有对象锁,其它线程再想获取这个对象锁时就会阻塞住。这样就能保证拥有锁的线程可以安全的执行临界区内的代码,不用担心线程上下文切换。本博文将详细介绍synchronized原理和底层实现。一、synchronized的作用为了避免临界区的竞态条件发生,有多种手段可以达到目的阻塞式的解决方案:synchronized原创 2022-05-15 15:41:21 · 325 阅读 · 0 评论 -
并发编程——Volatile原理
摘要主要是分析Volatile的这个关键字和涉及到一些原理。测试案例JMM(JavaMemoryModel)JMM:Java内存模型,是java虚拟机规范中所定义的一种内存模型,Java内存模型是标准化的,屏蔽掉了底层不同计算机的区别(注意这个跟JVM完全不是一个东西,只有还有小伙伴搞错的)。其实早期计算机中cpu和内存的速度是差不多的,但在现代计算机中,cpu的指令速度远超内存的存取速度,由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读原创 2021-04-08 19:50:47 · 356 阅读 · 0 评论 -
并发编程——Unsafe、Atomic原理
Java中的13个原子操作类保证原子操作的原理处理器提供总线锁定和缓存锁定两个机制来保证复杂内存操作的原子性。1)使用总线锁保证原子性。第一个机制是通过总线锁保证原子性。如果多个处理器同时对共享变量进行读改写操作(i++就是经典的读改写操作),那么共享变量就会被多个处理器同时进行操作,这样读改写操作就不是原子的,操作完之后共享变量的值会和期望的不一致。举个例子,如果i=1,我们进行两次i++操作,我们期望的结果是3,但是有可能结果是2,如图2-3所示。原因可能是多个处理器同时从各自.原创 2020-10-08 13:57:31 · 401 阅读 · 2 评论 -
并发编程——ThreadLocal原理
Java内存模型java的内存模型的基础在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。同步是指程序中用于控制不同线程间操作发生相对顺序的机制。在共享内存并发模原创 2020-10-06 14:41:12 · 364 阅读 · 0 评论 -
并发编程——ReentrantLock/Condition原理
摘要ReentrantLock锁是一个轻量级锁,底层其实就是用自旋锁实现的,lock锁不依赖操作系统,而是使用java实现的锁,当我们调用lock方法的时候,在内部其实调用了Sync.lock()方法,而Sync继承了AbstractQueuedSynchronizer,简称AQS,所以在底层调用的其实是AQS的 lock() 方法;ReentrantLock和synchronized不同的是,synchronized在jdk1.5以前是一把很重的锁,每次使用时都需要向操作系统申请,所以会耗费很大的资源原创 2022-05-16 09:12:32 · 216 阅读 · 0 评论 -
并发编程——ThreadPool原理
Java中的线程池Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用线程池,必须对其实现..原创 2020-10-07 19:47:20 · 419 阅读 · 0 评论 -
并发编程——AbstractQueuedSynchronizer原理
摘要主要是分析AQS的相关的原理https://juejin.cn/post/6945982971639758856深在Java多线程编程中,重入锁(ReentrantLock) 和信号量(Semaphore)是两个极其重要的并发控制工具。相信大部分读者都应该比较熟悉它们的使用入浅出AbstractQueuedSynchronizer。但是不知道大家是不是有了解过重入锁和信号量的实现细节? 我就带大家看一看它们的具体实现。首先,先上一张重要的类图,来说明一下三者之间的关系:可以看到, 重原创 2021-04-02 12:40:07 · 255 阅读 · 0 评论 -
并发编程——Forkjoin设计模式原理
Executor框架在HotSpot VM的线程模型中,Java线程(java.lang.Thread)被一对一映射为本地操作系统线程。Java线程启动时会创建一个本地操作系统线程;当该Java线程终止时,这个操作系统线程也会被回收。操作系统会调度所有线程并将它们分配给可用的CPU。在上层,Java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定数量的线程;在底层,操作系统内核将这些线程映射到硬件处理器上。这种两级调度模型的示意图如图10-1所示原创 2020-10-07 20:28:25 · 573 阅读 · 0 评论 -
并发编程——CountDownLatch/CyclicBarrier/Semaphore原理
Java中的并发工具类在JDK的并发包里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线程间交换数据的一种手段。本章会配合一些应用场景来介绍如何使用这些工具类。等待多线程完成的CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。假如有这样一个需求:我们需要解析一个Excel里多个sheet的数据,此时可以考虑使用多线程,每原创 2020-10-08 10:55:16 · 386 阅读 · 0 评论 -
并发编程——LongAdder原子类
摘要主要是介绍面试过程中的遇到的并发编程的问题和解答方法。主要是介绍线程池的原理通过Executors创建线程池的弊端在创建线程池的时候,大部分人还是会选择使用Executors去创建。下面是创建定长线程池(FixedThreadPool)的一个例子,严格来说,当使用如下代码创建线程池时,是不符合编程规范的。ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);线程池不允许使用Executors去创建,而是通原创 2021-03-28 19:36:10 · 196 阅读 · 0 评论 -
并发编程——LockSupport与线程中断原理
java的线程线程作为操作系统调度的最小单元,多个线程能够同时执行,这将显著提升程序性能,在多核环境中表现得更加明显。但是,过多地创建线程和对线程的不当管理也容易造成问题。现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作系统就会创建一个Java进程。现代操作系统调度的最小单元是线程,也叫轻量级进程(LightWeight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高原创 2020-10-08 14:51:23 · 304 阅读 · 0 评论 -
并发编程——Fork/Join原理与实战
java的并发容器Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork/Join框架原理ForkJoinPool由ForkJoinTask数组和ForkJoinWorkerThread数组组成,ForkJoinTask数组负责将存放程序提交给ForkJoinPool的任务,而ForkJoinWorkerThread数组负责执行这些任务。(1)ForkJoinTask的fork方法实现原理原创 2020-10-08 14:22:37 · 458 阅读 · 0 评论 -
并发编程——wait/notify/notifyall与await/single/singleAll原理
但是疑问又来了,为什么使用线程池的时候,线程因异常被中断却没有抛出任何信息呢?还有平时如果是在main函数里面的异常也会被抛出来,而不是像线程池这样被吞掉。如果子线程抛出了异常,线程池会如何进行处理呢?我提交任务到线程池的方式是: threadPoolExecutor.submit(Runnbale task); ,后面了解到使用execute()方式提交任务会把异常日志给打出来,这里研究一下为什么使用submit 提交任务,在任务中的异常会被“吞掉”它会被线程池包装成RunnableFut原创 2021-05-11 14:18:35 · 396 阅读 · 2 评论