多线程
文章平均质量分 77
java 多线程相关知识
LiZhen798
软件研发工程师
语言:Java,Go
展开
-
lock()与lockInterruptibly()
另一种是线程被唤醒后检测到中断请求,则立即抛出中断异常,该操作导致方法结束。结论:ReentrantLock的中断和非中断加锁模式的区别在于:线程尝试获取锁操作失败后,在等待过程中,如果该线程被其他线程中断了,它是如何响应中断请求的。如果要求被中断线程不能参与锁的竞争操作,则此时应该使用lockInterruptibly方法,一旦检测到中断请求,立即返回不再参与锁的竞争并且取消锁获取操作。lock获取锁过程中,忽略了中断,在成功获取锁之后,再根据中断标识处理中断,即selfInterrupt中断自己。原创 2023-03-16 14:29:39 · 343 阅读 · 0 评论 -
线程池的五种状态
当线程池的状态变为TIDYING状态时,会调用钩子函数terminated(),该方法在ThreadPoolExecutor中是空的,若用户想在线程池变为TIDYING时进行相应的处理,就需要重载terminated()函数实现。状态切换:当线程池状态为SHUTDOWN时,阻塞队列为空并且线程池中执行的任务也为空时,就会由SHUTDOWN->TIDYING。状态切换:线程池的初始状态为RUNNING。状态说明:线程池处于STOP状态时,不接收新任务,不处理已添加的任务,并且会中断正在处理的任务。原创 2023-01-31 17:07:17 · 580 阅读 · 0 评论 -
CompletableFuture实现线程池结果
向线程池中提交任务的submit方法不是阻塞方法,而Future.get方法是一个阻塞方法,当submit提交多个任务时,只有所有任务都完成后,才能使用get按照任务的提交顺序得到返回结果。Future虽然可以实现获取异步执行结果的需求,但是它没有提供通知的机制,要么使用阻塞,在future.get()的地方等待future返回的结果,这时又变成同步操作;要么使用isDone()轮询地判断Future是否完成,这样会耗费CPU的资源原创 2022-10-10 11:43:33 · 2719 阅读 · 0 评论 -
shutdown、shutdownNow方法的理解
1、当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态。此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。...原创 2022-08-17 14:33:08 · 1808 阅读 · 0 评论 -
多线程某个线程异常了怎么处理
目录一个简单的例子submit方法执行时异常信息为什么消失了Future是如何吃掉异常信息的如何拿到submit提交的线程任务的异常信息通过统一Runnable父类实现异常信息的统一处理通过自定义的线程池来对异常信息进行统一的处理。异常信息作为我们平时定位问题的一大法宝,其重要性是不言而喻的。一段代码出现了问题,如果它的异常信息被吃了,那么一个本来很简单的问题,定位起来也会变的很麻烦。今天我们就从异常信息被吃掉,导致相应信息没有输出到日志的问题说起。一个简单的例子首先原创 2021-11-03 19:58:35 · 2734 阅读 · 0 评论 -
控制并发线程数-Semaphore(信号量)的简单使用
Semaphore(信号量)用来控制并发访问的线程数量,它通过协调各个线程来保证资源的合理使用。其内部使用的是AQS机制(concurrent包下很多类实现原理都是基于AQS)。Semaphore实现控制并发线程数可以抽象为停车场模型,一个固定车位的停车场,当车位满了,便不再允许新的车辆进入;若当前车库驶出多少辆,则就允许进入多少辆。Semaphore做的就是监控车位大小功能。通过构造函数new Semaphore(N)来实现,N表示最多并发访问的线程数。所以当初始化创建了5个许可证时,如果多余5个线程并发原创 2021-10-13 14:01:34 · 463 阅读 · 0 评论 -
Java Fork/Join框架
原文译序Doug Lea大神关于Java 7引入的他写的Fork/Join框架的论文。响应式编程(Reactive Programming/RP)作为一种范式在整个业界正在逐步受到认可和落地,是对过往系统的业务需求理解梳理之后对系统技术设计/架构模式的提升总结。Java作为一个成熟平台,对于趋势一向有些稳健的接纳和跟进能力,有着令人惊叹的生命活力:Java 7提供了ForkJoinPool,支持了Java 8提供的Stream。 另外Java 8还提供了Lamda(有效地表达和使用...原创 2021-09-02 19:55:39 · 329 阅读 · 0 评论 -
线程池需要关闭吗
线程池关闭的意义不仅仅在于结束线程执行,避免内存溢出,因为大多使用的场景并非上述示例那样 朝生夕死。线程池一般是持续工作的全局场景,如数据库连接池。Executors作为局部变量时,创建了线程,一定要记得调用executor.shutdown();来关闭线程池,如果不关闭,会有线程泄漏问题。import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class T..原创 2021-08-27 11:17:49 · 9667 阅读 · 11 评论 -
一个线程池中的线程异常了,那么线程池会怎么处理这个线程?
线程池常用问题 不允许使用的原因 测试流程 测试用例 抛出堆栈异常为啥对了一半? 怎么拿到submit的异常堆栈? 源码查看 执行executes方法时 执行submit方法时 不影响其他线程任务 这个线程会被放回线程池为啥错了 结论 1、当执行方式是execute时,可以看到堆栈异常的输出 2、当执行方式是submit时,堆栈异常没有输出。但是调用Future.get()方法时,可以捕获到异常 3、不会影响线程池里面其他线程的正常执行 4、线程池会原创 2021-08-11 16:15:39 · 4578 阅读 · 1 评论 -
详解Condition的await和signal等待/通知机制
1.Condition简介任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制,同样的, 在java Lock体系下依然会有同样的方法实现等待/通知机制。从整体上来看Object的wait和notify/notify是与对象监视器配合完成线程间的等待/通知机制,而Conditi原创 2021-06-16 19:44:05 · 724 阅读 · 0 评论 -
多线程之volatile
volatile字面意思易变的,不稳定的。当volatile修饰变量时意味着这种变量的读写必须从主内存中读取,以保证读取最新的值。因此volatile修饰的变量不会去寄存器存储,都是内存操作。原创 2021-06-03 00:25:47 · 254 阅读 · 0 评论 -
公平锁和非公平锁的区别
前言上次我们提到了乐观锁和悲观锁,那我们知道锁的类型还有很多种,我们今天简单聊一下,公平锁和非公平锁两口子,以及他们在我们代码中的实践。正文开始聊之前,我先大概说一下他们两者的定义,帮大家回顾或者认识一下。公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。 优点:所有的线程都能得到资源,不会饿死在队列中。 缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。 非公平锁:多个线转载 2021-05-28 15:20:56 · 1903 阅读 · 0 评论 -
CountDownLatch详解
CountDownLatch中count down是倒数的意思,latch则是门闩的含义。整体含义可以理解为倒数的门栓,似乎有一点“三二一,芝麻开门”的感觉。CountDownLatch的作用也是如此,在构造CountDownLatch的时候需要传入一个整数n,在这个整数“倒数”到0之前,主线程需要等待在门口,而这个“倒数”过程则是由各个执行线程驱动的,每个线程执行完一个任务“倒数”一次。总结来说,CountDownLatch的作用就是等待其他的线程都执行完任务,必要时可以对各个任务的执行结果进行汇总,..原创 2021-05-27 16:56:53 · 667 阅读 · 0 评论 -
分布式锁代码分析
业务后台的分布式锁核心代码如下:【问题分析】 1.在正常情况下,该段代码逻辑没用问题 2.但在网络发生抖动的情况下,可能导致用户首次上锁成功,再次上锁失败: a.调用tryLock b.运行 Long number =redis.incr(lockKey) 成功 c.网络抖动 d.运行redis.expire() 抛出网络异常,锁永远不会失效;unLock()将无法解锁,tryLock()也将失败。3.该问题发...原创 2021-03-25 17:00:19 · 136 阅读 · 0 评论 -
锁和分布式锁
目录一、线程安全二、JVM锁三、分布式锁3.1 分布式锁的概念3.2 分布式锁的条件3.3 分布式锁的实现方式四、Redisson实现分布式锁原理4.1 基于redis的分布式锁4.1.1 加锁操作4.1.2 解锁操作4.1.3. 死锁4.1.4 Redis操作的原子性4.1.5 Redis 分布式锁演变过程4.2 Redisson原理图4.2.1、加锁入口4.2.2、异步加锁方法4.2.3、加锁lua脚本4.2.4、存入的...原创 2021-03-22 17:00:17 · 514 阅读 · 0 评论 -
java多线程系列——关于多线程中的锁
目录同步锁JUC包中的锁01. Lock接口02. ReadWriteLock03. AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer04. LockSupport05. Condition06. ReentrantLock07. ReentrantReadWriteLock08. CountDownLatch09. CyclicBarrie.原创 2021-03-16 15:41:33 · 206 阅读 · 0 评论 -
线程的5种状态详解
Java中的线程的生命周期大体可分为5种状态。1.新建(NEW):新创建了一个线程对象。2.可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。3.运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。4.阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cp...转载 2021-03-10 17:10:53 · 180 阅读 · 0 评论 -
Java中的可见性问题
目录前言什么是 Java 内存模型?程序的顺序性Happens-Before 规则volatile 变量规则传递性规则管程中锁的规则线程 start() 规则线程 join() 规则线程中断规则final规则总结前言编程中可见性、原子性、有序性导致的问题常常会违背我们的直觉,从而成为并发编程的 Bug 之源。这三者在编程领域属于共性问题,所有的编程语言都会遇到,Java 在诞生之初就支持多线程,自然也有针对这三者的技术方案,而且在编程语言领域处于领先地原创 2021-03-10 15:29:49 · 400 阅读 · 0 评论 -
java中的多线程
引如果对什么是线程、什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内。用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。很多人都转载 2018-01-03 14:31:20 · 202 阅读 · 0 评论 -
Synchronized与ReentrantLock区别
作为Java中举足轻重的并发编程,同步是非常重要的机制;在Java中提供了JVM层面的 synchronized来保持同步;同时也提供了与synchronized非常相似的代码层面上的ReentrantLock 的同步机制。 那么synchronized 和 ReentrantLock有区别和联系呢: 1、RentrantLock提供了synchroni转载 2017-06-23 13:53:46 · 336 阅读 · 0 评论 -
【Java线程】锁机制:synchronized、Lock、Condition
http://www.infoq.com/cn/articles/java-memory-model-5 深入理解Java内存模型(五)——锁 http://www.ibm.com/developerworks/cn/java/j-jtp10264/ Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制http://blog.csdn.net/ghsau/artic转载 2017-06-30 20:27:47 · 246 阅读 · 0 评论 -
ReentrantLock锁与内置锁synchronized
一、内置锁使用Syschronized 关键字 同步代码块(同步方法)都是使用到对象的内置锁1、对象内置锁使用对象自身的内置锁(监视器锁-monitor lock) 实例方法-使用实例对象锁,static 方法 使用Class对象锁 对象内置锁为互斥锁,一个同步块,只有一个线程进入 同步代码块中的代码具有原子性 进入代码块内获取到锁,无论正常退出or异常都会释放锁2、可转载 2017-06-30 20:04:52 · 355 阅读 · 0 评论