多线程和高并发
文章平均质量分 92
多线程和高并发
ZWZhangYu
这个作者很懒,什么都没留下…
展开
-
【线上多线程问题总结】记一次项目线程数持续增加至1500多问题
根据运维反馈的线程数量趋势图 ,可以看到在1月~3月中旬线程数都是稳定的,这个数量大概在几十~1百左右,这个数量还比较合理,tomcat的线程数以及项目中的线程池。但是从3月底开始线程数就一直持续上升,到4月底又突然降低至稳定点,然后又持续波动,并在5月1号后持续上升,截止今天容器的线程数以及增长到1500多。原创 2024-06-29 07:42:08 · 800 阅读 · 0 评论 -
并发编程——AQS结合ReentrantLock 分析
文章目录(1)ReentrantLock 代码结构(2)初始化state(3)获取锁1. FairSync#lock2. FairSync#tryAcquire3. AbstractQueuedSynchronizer#addWaiter4. AbstractQueuedSynchronizer#enq5. AbstractQueuedSynchronizer#acquireQueued6.AbstractQueuedSynchronizer#shouldParkAfterFailedAcquire(4)释原创 2021-10-30 20:48:21 · 963 阅读 · 0 评论 -
并发编程——AQS结合CountDownLatch 分析
文章目录(1)基础结构(2)构造函数(3)countDown(4)await(1)基础结构上面展示了CountDownLatch 的类结构,其中有一个静态内部类Sync。这个类正是继承自 AQS,并且重写了tryAcquireShared、tryReleaseShared方法。在 Sync 类里,根据是否是独占,来重写对应的方法。如果是独占,则重写 tryAcquire 或 tryRelease 等方法;如果是非独占,则重写 tryAcquireShared 和 tryReleaseShared原创 2021-10-30 20:44:07 · 1126 阅读 · 0 评论 -
并发编程——AQS原理分析
AQS 是一个用于构建锁、同步器等线程协作工具类的框架,有了 AQS 以后,很多用于线程协作的工具类就都可以很方便的被写出来,有了 AQS 之后,可以让更上层的开发极大的减少工作量,避免重复造轮子,同时也避免了上层因处理不当而导致的线程安全问题,因为 AQS 把这些事情都做好了。总之,有了 AQS 之后,我们构建线程协作工具类就容易多了。原创 2021-10-30 20:34:56 · 1151 阅读 · 0 评论 -
❤️并发编程❤️CAS原理分析 Unsafe分析
文章目录(一)原理(二)CAS的应用(1)原子类(2)ConcurrentHashMap(3)数据库的乐观锁机制(三)自定义CAS和Unsafe类使用(1)自定义CAS(2)自定义循环CAS(3)使用Unsafe(四)CAS的缺点(1)ABA问题(2)自旋时间过长(3)范围不能灵活控制(一)原理CAS的全称是:比较并交换(Compare And Swap)。在CAS中,有这样三个值:V:要更新的变量(var)E:预期值(expected)N:新值(new)比较并交换的过程如下:判断V是否等于E原创 2021-10-24 10:38:52 · 1082 阅读 · 0 评论 -
❤️并发编程❤️CountDownLatch和CyclicBarrier
CountDownLatch允许一个或多个线程等待其他线程完成操作。CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一 组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会 开门,所有被屏障拦截的线程才会继续运行。原创 2021-10-23 19:35:26 · 1044 阅读 · 0 评论 -
❤️并发编程❤️Future实践整理(二)CompletableFuture
文章目录(一)FutureTask(二)使用 Future 有哪些注意点?(三)CompletableFuture(1)业务场景分析(2)CountDownLatch(2)CompletableFuture(一)FutureTaskFuture接口和实现Future接口的FutureTask类,代表异步计算的结果。既然 RunnableFuture 继承了 Runnable 接口和 Future 接口,而 FutureTask 又实现了 RunnableFuture 接口,所以 FutureTask原创 2021-10-23 10:49:29 · 1180 阅读 · 0 评论 -
❤️并发编程❤️Future实践整理(一)
在很多情况下执行一个子线程时,我们都希望能得到执行的任务的结果,也就是说,我们是需要得到返回值的,比如请求网络、查询数据库等。可是 Runnable 不能返回一个返回值,这是它第一个非常严重的缺陷。Future表示一个任务的生命周期,并提供了相应的方法来判断是否已经完成或取消,以及获取任务的结果和取消任务等。原创 2021-10-23 10:43:27 · 1110 阅读 · 0 评论 -
❤️并发编程❤️ThreadLocal进阶
文章目录(一)ThreadLocal 是用来解决共享资源的多线程访问的问题吗?(二)ThreadLocal 和 synchronized 是什么关系(三)Thread、 ThreadLocal 及 ThreadLocalMap原理分析(1)关系分析(2)ThreadLocal.get()源码分析(3)ThreadLocal.set()源码分析(4)ThreadLocalMap 结构分析(四)ThreadLocal的内存泄露问题分析(1)Key问题分析(2)Value 的泄漏(五)ThreadLocal、In原创 2021-10-18 21:05:14 · 975 阅读 · 0 评论 -
❤️并发编程❤️ThreadLocal基础
文章目录(一)基础认识(1)概述(2)ThreadLocal API(3)基本实例(二)ThreadLocal的使用——线程运行耗时统计(三)使用场景分析(一)基础认识(1)概述定义:提供线程局部变量,一个线程局部变量在多个线程中,分别有独立的值(副本)特点:简单(开箱即用)、快速(无额外开销)、安全(线程安全)场景:多线程场景(资源持有、线程一致性、并发计算、线程安全等)实现原理:Java中用哈希表实现应用范围:几乎所有提供多线程特征的语言(2)ThreadLocal APIpub原创 2021-10-18 21:00:25 · 1043 阅读 · 0 评论 -
❤️并发编程❤️各式各样的“锁”
Java多线程的锁都是基于对象的,Java中的每一个对象都可以作为一个锁。还有一点需要注意的是,我们常听到的类锁其实也是对象锁。Java类只有一个Class对象(可以有多个实例对象,多个实例共享这个Class对象),而Class对象也是特殊的Java对象。所以我们常说的类锁,其实就是Class对象的锁。原创 2021-10-05 22:41:57 · 1086 阅读 · 0 评论 -
❤️并发编程❤️synchronized锁原理分析
在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。在Java SE 1.6中为了减少获得锁和释放锁带来的性能消耗引入了偏向锁和轻量级锁。原创 2021-10-05 22:35:56 · 1114 阅读 · 0 评论 -
❤️并发编程❤️如何正确关闭线程池?shutdown 和 shutdownNow 的区别?
shutdownNow()表示立刻关闭的意思。在执行 shutdownNow 方法之后,首先会给所有线程池中的线程发送 interrupt 中断信号,尝试中断这些任务的执行,然后会将任务队列中正在等待的所有任务转移到一个 List 中并返回,我们可以根据返回的任务 List 来进行一些补救的操作,例如记录在案并在后期重试。原创 2021-10-05 11:21:56 · 1543 阅读 · 0 评论 -
❤️并发编程❤️线程池源码分析以及线程复用的原理
ThreadPoolExecutor在创建线程时,会将线程封装成工作线程worker,并放入工作线程组中,然后这个worker反复从阻塞队列中拿任务去执行。worker会不断地调用getTask方法从阻塞队列中获取任务然后调用task.run()执行任务,从而达到复用线程的目的。只要getTask方法不返回null,此线程就不会退出。原创 2021-10-04 21:33:35 · 1106 阅读 · 0 评论 -
❤️并发编程❤️线程安全问题分析和场景总结
当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行问题,也不需要进行额外的同步,而调用这个对象的行为都可以获得正确的结果,那这个对象便是线程安全的原创 2021-10-03 17:38:24 · 1620 阅读 · 0 评论 -
❤️并发编程❤️生产者消费者模式实现的三种方式
生产者和消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消 费者彼此之间不直接通信,而是通过阻塞队列来进行通信,所以生产者生产完数据之后不用 等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取, 阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。原创 2021-10-03 11:17:37 · 1322 阅读 · 0 评论 -
❤️并发编程❤️一万字线程生命周期和状态转换知识梳理
文章目录(一)状态转换(1)操作系统中的线程状态转换(2)Java线程状态(二)Java六个状态分析(1) New 新创建(2)Runnable 可运行(3)Blocked 被阻塞(4)Waiting 等待(5)Timed Waiting 等待(6)Terminated 终止(三)实践案例分析(1)反复调用同一个线程的start()方法是否可行?(2)分析如下代码检查问题(3)Waiting 状态和Blocked 状态的分析(4)wait(),notify()实践以及唤醒后线程执行位置分析(5)java.l原创 2021-10-02 21:57:04 · 1183 阅读 · 0 评论 -
❤️并发编程❤️ 如何正确停止线程?
对于 Java 而言,最正确的停止线程的方式是使用 interrupt。但 interrupt 仅仅起到通知被停止线程的作用。而对于被停止的线程而言,它拥有完全的自主权,它既可以选择立即停止,也可以选择一段时间后停止,也可以选择压根不停止。这个的意思就是说如果执行了interrupt,被中断的线程不会立刻停止执行任务,而是会根据自身任务执行情况选择停止,一般会等待任务执行完成后中断停止原创 2021-10-02 11:09:18 · 1113 阅读 · 0 评论 -
显式锁Lock和内置锁知识整理
文章目录(一)基础认识(1)synchronized内置锁的不足之处(2)锁的几种分类1. 可重入锁和非可重入锁2. 公平锁与非公平锁3. 读写锁和排它锁(二)Lock(1)ReentrantLock(2)轮询锁与定时锁(3)可中断的锁获取操作(4)非块结构的加锁(5)ReentrantReadWriteLock(6)Condition的使用以及和Object的监视器比较(7)synchronized和ReentrantLock的选择参考(一)基础认识(1)synchronized内置锁的不足之处【1原创 2021-09-25 10:43:59 · 1366 阅读 · 0 评论 -
重排序与happens-before
文章目录(一)重排序(1)为什么要进行指令重排序?(二)顺序一致性模型与JMM的保证(1)顺序一致性模型(2)JMM中未同步程序的顺序一致性效果(三)happens-before(1)基础(2)天然的happens-before关系(一)重排序(1)为什么要进行指令重排序?计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排。简单地说,每一个指令都会包含多个步骤,每个步骤可能使用不同的硬件。因此,流水线技术产生了,它的原理是指令1还没有执行完,就可以开始执行指令2,而不用等到指令1执行结原创 2021-09-05 20:25:53 · 1659 阅读 · 0 评论 -
Java内存模型
文章目录Java内存模型(一)并发编程模型(1)两种并发模型(二)Java内存模型的抽象结构(1)模型结构(2)Java内存模型(简称JMM)(3)JMM与Java内存区域划分的区别与联系Java内存模型(一)并发编程模型(1)两种并发模型俩种并发模型:1:消息传递并发模型2:共享内存并发模型在Java中,使用的是共享内存并发模型。(二)Java内存模型的抽象结构(1)模型结构对于每一个线程来说,栈都是私有的,而堆是共有的。也就是说在栈中的变量(局部变量、方法定义参数、异常处理器参原创 2021-09-05 20:24:01 · 1547 阅读 · 0 评论 -
创建线程的四种方式 线程通信
文章目录1.1 创建线程1.1.1 创建线程的四种方式1.1.2 Thread类与Runnable接口的比较1.1.3 Callable、Future与FutureTask1.2 线程组和线程优先级1.3 Java线程的状态及主要转化方法1.4 Java线程间的通信1.4.1 等待/通知机制1.4.2 信号量1.4.3 管道1.1 创建线程1.1.1 创建线程的四种方式【1】继承Thread类【2】实现Runnable接口【3】实现Callable,获取返回值【4】实现FutureTask类T原创 2021-09-04 22:03:54 · 2165 阅读 · 0 评论