
java基础之多线程
文章平均质量分 97
1、并发编程的使用
2、并发编程的原理
程序员 jet_qi
白龙马服务平台员工,擅长并发开发(juc,netty),分布式(springboot+MQ,rpc,ES,dubbo),擅长商品域,财务域业务知识,是设计模式实战的狂热者。
博客主要分享内容:职场经验分享、自学教程、面试真题解析、面试经验分享、技术专题深度解析等。
关于我的文章:那些你很容易就能看得懂的文章,是不会让你显得与众不同的,我会保证所写的每一句话,每一行代码都经过了认真的推敲、仔细的斟酌,希望大家能有所收获。
吃不了学习的苦,就得吃生活的苦,别在最应该努力的年纪躺平
展开
-
JUC第一讲:juc并发包深入理解(P6熟练 P7精通)
juc并发包,用过哪些? 参考 并发编程的艺术 方腾飞先来一道面试题关于java并发包1、concurrentHashmap1.1、不同版本的并发hashmap区别1.2、属性1.3、concurrentHashmap组成1.4、put操作1.5、get(key)1.6、扩容时要注意的?1.7、为什么使用并发hashmap2、线程池 Executor/ThreadPoolExecute............原创 2018-12-24 22:32:36 · 8052 阅读 · 0 评论 -
JUC第23讲:Java线程池最佳实践
本文是JUC第23讲,先介绍为什么使用线程池;然后结合实际业务,讲解如何使用线程池,以及使用过程中踩过的坑。原创 2024-09-25 09:07:24 · 1253 阅读 · 1 评论 -
JUC第一讲:Java并发知识体系详解 + 面试题汇总(P6熟练 P7精通)
面试时常常被面试官问到这个问题,Java并发包含实际业务开发中的方方面面。本篇文章是JUC第1讲,作为开篇,讲解Java 并发相关知识体系,包含理论基础,线程基础,synchronized,volatile,final关键字,JUC框架等内容。原创 2023-09-17 16:45:17 · 899 阅读 · 1 评论 -
JUC第二讲:Java并发理论基础:Java内存模型(JMM)与线程
本文是JUC第二讲:Java并发理论基础,Java内存模型(JMM)与线程。从理论的角度引入并发安全问题以及JMM应对并发问题的原理。原创 2023-09-18 10:51:53 · 596 阅读 · 0 评论 -
JUC第三讲:Java 并发-线程基础
本文是JUC第三讲,主要概要性的介绍线程的基础,为后面的章节深入介绍Java并发的知识提供基础。原创 2023-09-19 09:00:00 · 354 阅读 · 0 评论 -
JUC第四讲:Java中的锁
Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文是JUC第4讲,旨在对锁相关源码(本文中的源码来自JDK 8和Netty 3.10.6)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。原创 2023-09-20 09:00:00 · 268 阅读 · 0 评论 -
JUC第四讲:Java中的锁/CAS原理与案例分析
synchronized是Java的关键字,是Java的内置特性,在JVM层面实现了对临界资源的同步互斥访问synchronized特点synchronized则可以使用在变量、方法(静态方法,同步方法)、和类级别的修饰代码块时,减少了锁范围,耗时的代码放外面,可以异步调用synchronized各种加锁场景?1、作用于非静态方法,锁住的是对象实例(this),每一个对象实例有一个锁}}3、作用于Lock.class,锁住的是Lock的Class对象,也是全局只有一个}}...原创 2022-07-28 19:30:23 · 534 阅读 · 0 评论 -
JUC第五讲:关键字synchronized详解
在C程序代码中我们可以利用操作系统提供的互斥锁来实现同步块的互斥访问及线程的阻塞及唤醒等工作。在Java中除了提供Lock API外,还在语法层面上提供了synchronized关键字来实现互斥同步原语,本文是JUC第五讲,将对synchronized关键字详细分析。原创 2023-09-21 09:00:00 · 276 阅读 · 0 评论 -
JUC第六讲:二面阿里竟然败在了 volatile 关键字上
相比Sychronized(重量级锁,对系统性能影响较大),volatile提供了另一种解决可见性和有序性问题的方案,本文是JUC第六讲,volatile关键字详解。原创 2023-09-22 09:00:00 · 362 阅读 · 2 评论 -
JUC第七讲:关键字final详解
final 关键字看上去简单,但是真正深入理解的人可以说少之又少。本文是JUC第七讲:关键字final详解,将常规的用法简化,提出一些用法和深入的思考。原创 2023-09-23 09:00:00 · 266 阅读 · 0 评论 -
JUC第八讲:Condition源码分析
本文是JUC第八讲,Condition详解。任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括 wait()、**wait(long timeout)、notify()**以及notifyAll()方法,这些方法与 synchronized 同步关键字配合,可以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方式以及功能特性上还是有差别的。原创 2023-09-24 09:00:00 · 236 阅读 · 0 评论 -
JUC第九讲:类汇总和学习指南
本文是JUC第九讲,对JUC进行知识体系解读,后续的文章还针对几乎所有的核心的类以及常用的`工具类`作了详细的解读; 本文站在一定的高度了解JUC下包的设计和实现;同时对重要的章节提供跳转链接。原创 2023-09-25 11:09:48 · 192 阅读 · 0 评论 -
JUC第十讲:CAS,Unsafe和原子类详解
JUC中多数类是通过volatile和CAS来实现的,CAS本质上提供的是一种无锁方案,而Synchronized和Lock是互斥锁方案; java原子类本质上使用的是CAS,而CAS底层是通过Unsafe类实现的。本文是JUC第十讲,将对CAS, Unsafe和原子类详解。原创 2023-09-26 09:00:00 · 233 阅读 · 0 评论 -
JUC第十一讲:JUC锁LockSupport详解
本文是JUC第十一讲:JUC锁LockSupport详解。LockSupport是锁中的基础,是一个提供锁机制的工具类。原创 2023-09-27 09:00:00 · 189 阅读 · 0 评论 -
JUC第十二讲:JUC锁 - 看不懂锁核心类 AQS 原理来打我
本文是JUC第十二讲,JUC锁: 锁核心类AQS详解。AbstractQueuedSynchronizer抽象类是核心,需要重点掌握。它提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架。原创 2023-10-01 09:00:00 · 412 阅读 · 0 评论 -
JUC第十三讲:JUC锁: ReentrantLock详解
本文是JUC第十三讲,JUC锁: ReentrantLock详解。可重入锁ReentrantLock的底层是通过 AbstractQueuedSynchronizer 实现,所以先要学习上一章节 AbstractQueuedSynchronizer 详解。原创 2023-10-02 22:18:51 · 399 阅读 · 0 评论 -
JUC第十四讲:JUC锁: ReentrantReadWriteLock详解
本文是JUC第十四讲:JUC锁 - ReentrantReadWriteLock详解。ReentrantReadWriteLock表示可重入读写锁,ReentrantReadWriteLock中包含了两种锁,读锁ReadLock和写锁WriteLock,可以通过这两种锁实现线程间的同步。原创 2023-10-04 23:03:23 · 898 阅读 · 0 评论 -
JUC第十五讲:JUC集合 - 面试 ConcurrentHashMap 看这篇就够了
本文是JUC第十五讲:JUC集合-ConcurrentHashMap详解。JDK1.7之前的ConcurrentHashMap使用分段锁机制实现,JDK1.8则使用数组+链表+红黑树数据结构和CAS原子操作实现ConcurrentHashMap;本文将分别介绍这两种方式的实现方案及其区别。原创 2023-10-05 23:41:49 · 443 阅读 · 0 评论 -
JUC第十六讲:JUC集合: CopyOnWriteArrayList详解
本文是JUC第十六讲,JUC集合: CopyOnWriteArrayList详解。CopyOnWriteArrayList是ArrayList 的一个线程安全的变体,其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的拷贝来实现的。COW模式的体现原创 2023-10-06 23:42:56 · 199 阅读 · 0 评论 -
JUC第十七讲:JUC集合: ConcurrentLinkedQueue详解
本文是JUC第十七讲:JUC集合 - ConcurrentLinkedQueue详解。ConcurerntLinkedQueue一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部是在队列中时间最长的元素。队列的尾部是在队列中时间最短的元素。新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许使用null元素。原创 2023-10-07 23:45:23 · 787 阅读 · 0 评论 -
JUC第十八讲:JUC集合-BlockingQueue 详解
JUC里的 BlockingQueue 接口表示一个线程安全放入和提取实例的队列。本文是JUC第十八讲,将给你演示如何使用这个 BlockingQueue,不会讨论如何在 Java 中实现一个你自己的 BlockingQueue。原创 2023-10-09 21:03:01 · 250 阅读 · 0 评论 -
JUC第十九讲:Java线程池实现原理及其在美团业务中的实践
随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。本文是JUC第十九讲,Java线程池实现原理及其在美团业务中的实践。开篇简述线程池概念和用途,接着结合线程池的源码,帮助读者领略线程池的设计思路,最后回归实践,通过案例讲述使用线程池遇到的问题,并给出了一种动态化线程池解决方案原创 2023-10-08 16:29:11 · 200 阅读 · 0 评论 -
JUC第二十讲:深入理解 Java 中的线程池
先看几道多线程相关的问题1、三个线程 a、b、c并发运行,b,c线程需要a的数据怎么实现?难点:1、是让 ThreadB 和 ThreadC 等待 ThreadA 先执行完2、 ThreadA 执行完之后给ThreadB和ThreadC发送消息思路:我们必须让ThreadB和ThreadC去等待ThreadA完成任务后发出的消息 并使用Semaphore类来控制线程的等待acquire........................原创 2018-12-30 22:23:33 · 573 阅读 · 1 评论 -
JUC第二十一讲:JUC线程池:ScheduledThreadPoolExecutor详解
本文是JUC第二十一讲,JUC线程池: ScheduledThreadPoolExecutor详解。在很多业务场景中,我们可能需要周期性的运行某项任务来获取结果,比如周期数据统计,定时发送数据等。在并发包出现之前,Java 早在1.3就提供了 Timer 类(只需要了解,目前已渐渐被 ScheduledThreadPoolExecutor 代替)来适应这些业务场景。随着业务量的不断增大,我们可能需要多个工作线程运行任务来尽可能的增加产品性能,或者是需要更高的灵活性来控制和监控这些周期业务。原创 2023-10-10 10:54:52 · 209 阅读 · 0 评论 -
JUC第二十二讲:JUC线程池-FutureTask详解
FutureTask 为 Future 提供了基础实现,如获取任务执行结果(get)和取消任务(cancel)等。如果任务尚未完成,获取任务执行结果时将会阻塞。一旦执行结束,任务就不能被重启或取消(除非使用runAndReset执行计算)。FutureTask 常用来封装 Callable 和 Runnable,也可以作为一个任务提交到线程池中执行。除了作为一个独立的类之外,此类也提供了一些功能性函数供我们创建自定义 task 类使用。FutureTask 的线程安全由CAS来保证。原创 2023-03-26 16:58:41 · 620 阅读 · 0 评论 -
JUC第二十五讲:JUC线程池-CompletableFuture 实现原理与实践
CompletableFuture由 Java 8 提供,是实现异步化的工具类,上手难度较低,且功能强大,支持通过函数式编程的方式对各类操作进行组合编排。相比于ListenableFuture,CompletableFuture有效提升了代码的可读性,解决了“回调地狱”的问题。本文是JUC第二十五讲,主要讲述CompletableFuture 的原理与实践。原创 2023-10-12 14:50:08 · 383 阅读 · 0 评论 -
JUC第二十六讲:JUC工具类: CountDownLatch详解
在完成某些运算时,只有其他所有线程的运算全部完成,当前运算才继续执行,(异步转同步)可以用于统计多线程执行的时间。可被多个线程并发的实现减1操作,并在计数器为0后调用await方法的线程被唤醒,从而实现多线程间的协作1、提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架使用方式是继承:子类通过继承同步器并需要实现它的方法来管理其状态,管理方式是通过acquire和release方式操纵状态在多线程环境中对状态的操作必须保证原子性。原创 2023-03-28 11:30:53 · 349 阅读 · 0 评论 -
JUC第二十七讲:JUC工具类: CyclicBarrier详解
本文是JUC第二十七讲,JUC工具类: CyclicBarrier详解。CyclicBarrier中文名为:循环栅栏,底层是基于 ReentrantLock 和 AbstractQueuedSynchronizer 来实现的,在理解的时候最好和 CountDownLatch 放在一起理解。原创 2023-10-11 08:29:49 · 424 阅读 · 0 评论 -
JUC第二十八讲:JUC工具类: Semaphore详解
本文是JUC第二十八讲,JUC工具类: Semaphore详解。Semaphore底层是基于AbstractQueuedSynchronizer来实现的。Semaphore称为计数信号量,它允许n个任务同时访问某个资源,可以将信号量看做是在向外分发使用资源的许可证,只有成功获取许可证,才能使用资源。原创 2023-10-13 15:47:34 · 524 阅读 · 0 评论 -
JUC第二十九讲:JUC工具类: Phaser详解
本文是JUC第二十九讲,JUC工具类:Phaser详解。Phaser是JDK 7新增的一个同步辅助类,它可以实现 CyclicBarrier 和CountDownLatch 类似的功能,而且它支持对任务的动态调整,并支持分层结构来达到更高的吞吐量。原创 2023-10-14 22:29:24 · 300 阅读 · 0 评论 -
JUC第三十讲:JUC工具类:Exchanger详解
本文是JUC第三十讲,JUC工具类: Exchanger详解。Exchanger是用于线程协作的工具类,主要用于两个线程之间的数据交换。原创 2023-10-15 23:53:50 · 356 阅读 · 0 评论 -
JUC第三十一讲:ThreadLocal/InheritableThreadLocal详解/TTL-MDC日志上下文实践
本文是JUC第六讲:ThreadLocal/InheritableThreadLocal详解。ThreadLocal无论在项目开发还是面试中都会经常碰到,本文就 ThreadLocal 的使用、主要方法源码详解、内存泄漏问题展开讨论原创 2022-08-31 08:00:00 · 599 阅读 · 1 评论 -
JUC第三十五讲:多线程调优实战
摘要:在并发程序中,并不是启动更多的线程就能让程序最大限度地并发执行。线程数量设置太小,会导致程序不能充分地利用系统资源;线程数量设置太大,又可能带来资源的过度竞争,导致上下文切换带来额外的系统开销。本文就多线程中的上下文切换中的性能问题进行了探讨。 参考资料:刘超的《Java性能调优实战》1、上下文切换是什么?概念: 当一个线程的时间片用完了,或者因自身原因被迫暂停运行了,这个时候......原创 2019-10-05 23:05:48 · 968 阅读 · 1 评论 -
项目实战第十七讲:使用异步编排优化商品详情页(对外流量最大)
使用异步编排优化商品详情页, 商品详情页在业务高峰期频繁超时,导致下游业务受到影响;难点:商详页是整个系统中日均访问次数最高的页面之一, 数量多(4亿一千万商品、11.3亿sku),重量大(商详页包含了大量文字、图片)项目职责:①接口减负:提供大量入参上下文,减少数据量;②提供缓存+批量查询:减少查询次数;③异步编排:优化线程依赖关系,获取上一个任务返回的结果,并返回当前任务的返回值原创 2022-08-24 20:09:26 · 449 阅读 · 0 评论 -
java多线程的问题---面试必备@Deprecate
1、什么是线程?线程是指程序在执行过程中,能够执行程序代码的一个执行单元。4种状态:运行、就绪、挂起和结束线程是程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内存空间(代码段、数据段和堆空间)以及一些进程级的资源,但是各个线程拥有自己的栈空间。2、为什么使用多线程?多线程可以减少程序的响应时间。可以把耗时的线程分配到一个单独的线程去执行与进程相比,线程...原创 2018-08-17 18:34:57 · 298 阅读 · 0 评论