![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 65
大叶子不小
这个作者很懒,什么都没留下…
展开
-
进程、线程和协程之间的区别和联系
一、进程 进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。【进程间通信(IPC)】:管道(Pipe)、命名管道(FIFO)、消息队列(Message Queue) 、信号量(Semaphore) 、共享内存(Shared Memory);套接字(Socket)。二、线程 线程,有时被称为轻原创 2021-02-09 14:41:53 · 208 阅读 · 0 评论 -
线程生命周期的几种状态
目录线程生命周期的几种状态操作系统通用线程状态Java语言线程状态如何查看线程处在什么状态程序中调用getState()方法jstack 命令查看Arthas灵魂追问线程生命周期的几种状态刚接触线程生命周期时,我总是记不住,也理解不了他们的状态,可以说是比较混乱,更别说它们之间是如何进行状态转换的了。原因是我把操作系统通用线程状态和编程语言封装后的线程状态概念混淆在一起了操作系统通用线程状态个人觉得通用线程状态更符合我们的思考习惯。其状态总共...原创 2020-10-02 23:33:37 · 520 阅读 · 0 评论 -
ThreadGroup解读
我们的项目用到了ThreadGroup 把thread放到了threadGroup中,名称统一起来了; private static final ExecutorService EXECUTOR_SERVICE = new ThreadPoolExecutor(16, 32, 5L, TimeUnit.MINUTES, new ArrayBlockingQueue<>(1000), new ThreadFactory() {原创 2020-12-22 17:39:24 · 2102 阅读 · 0 评论 -
一个JDK线程池BUG引发的GC机制思考
总结:Executors.newSingleThreadPool 在执行的过程中,发生一次显式的线程切换,则会让编译器/代码生成器认为外层包装对象不可达,导致线程池提前shutdown,导致异常==============================================================问题描述前几天在帮同事排查生产一个线上偶发的线程池错误逻辑很简单,线程池执行了一个带结果的异步任务。但是最近有偶发的报错:java.util.concurrent.Re原创 2020-12-08 20:11:42 · 99 阅读 · 0 评论 -
记一次线程池引发的BUG,差点被祭天
背景在工作中遇到一个问题,我定义了一个线程池来执行任务,但是程序执行结束后任务没有全部执行完,当时心态就差点崩了。业务场景是这样的:由于统计业务需要,订单信息需要从主库中经过统计业务代码写入统计库(中间需要逻辑处理所以不能走binlog)。由于代码质量及历史原因,目前的重新统计接口是单线程的,粗略算了算一共有100万条订单信息,每100条的处理大约是10秒,所以理论上处理完全部信息需要28个小时,这还不算因为 mysql 中 limit 分页导致的后期查询时间以及可能出现的内存溢出导致中止统转载 2020-12-08 16:23:11 · 144 阅读 · 0 评论 -
notify()会立刻释放锁么?
大佬问我: notify()会立刻释放锁么?我的内心戏: 肯定会啊! 这么简单的问题?image聪明如我, 决定装小白, 回答: 不会?大佬: 很好, 小伙子基础不错!我:image大佬: 说说为什么我: ………………image于是, 有了这篇文章!问题的根本原来在于 “立刻”这个描述词!如果你和咸鱼君一样懵逼, 不妨往下看!技术大佬可以告辞了!!接下来, 我们深入的分析分析wait和notify...原创 2020-12-04 18:03:22 · 2408 阅读 · 2 评论 -
Synchronized和Lock区别
0、synchronized实现原理Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:普通同步方法,锁是当前实例对象 静态同步方法,锁是当前类的class对象 同步方法块,锁是括号里面的对象 当一个线程访问同步代码块时,它首先是需要得到锁,当退出或者抛出异常时必须要释放锁,那么它是如何来实现这个机制的呢?我们先看一段简单的代码:package cn.alibab.javap;public class SynchronizedTest { publi原创 2020-10-03 00:03:40 · 249 阅读 · 0 评论 -
为什么在catch InterruptException块中调用Thread.currentThread.interrupt()?
这是维持状态。当你捕获InterruptException并吞下它时,你基本上阻止任何更高级别的方法/线程组注意到中断。这可能会导致问题。通过调用Thread.currentThread().interrupt(),你可以设置线程的中断标志,因此更高级别的中断处理程序会注意到它并且可以正确处理它。Java Concurrency in Practice在第7.1.3节:响应中断时更详细地讨论了这一点。它的规则是:只有实现线程中断策略的代码才可以吞下中断请求。通用任务和库代码永远不应吞下中断原创 2020-10-02 23:20:29 · 1290 阅读 · 0 评论 -
如何在两个线程之间共享数据
阅读目录1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做。2,如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,例如,设计4个线程。其中两个线程每次对j增加1,另外两个线程对j每次减1,银行存取款每个线程执行的代码相同,可以使用同一个Runnable对象public class RunnalbleTest2 implements Runnable { privat...原创 2020-09-23 21:43:45 · 599 阅读 · 0 评论 -
面试问题(线程间通信以及全局静态字段的线程安全问题)
synchronized解决线程间通信:我对这个问题的理解是说这个线程结束会通知下一个等待的线程(这个涉及到synchronized锁升级机制,看是自旋等待还是被唤醒)。如果是解决唤醒的问题:那么可以用Reentrantlock,Semaphore,CyclicBarrier等synchronized解决线程间数据共享:我第一反应是它怎么能实现数据共享,看了好多文章,应该这个问题问的是如何解决多线程间数据共享的同步问题。但是threadlocal只能解决的是线程内的数据隔离问题,也解决不了线程间的数据共享原创 2020-09-23 11:04:28 · 119 阅读 · 0 评论 -
如何在两个线程之间共享数据
1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做。2,如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,例如,设计4个线程。其中两个线程每次对j增加1,另外两个线程对j每次减1,银行存取款每个线程执行的代码相同,可以使用同一个Runnable对象public class RunnalbleTest2 implements Runnable { private int threadCnt =原创 2020-09-23 10:26:10 · 649 阅读 · 4 评论 -
双重检查锁(DCL)问题
重排序的问题之前就了解,这次重新看了下,解决了之前为什么普通的创建对象不需要加volatile的问题。单线程里2和3虽然被重排序了,但是不影响串行语义但是多线程2和3重排序会导致出现多个对象的问题。问题来源以”懒汉式“单例模式为例(思想就是延迟高开销对象的初始化操作),代码如下。这是一个普通的POJO: /** * @author Dongguabai * @date 2018/9/23 22:21 */ import l..原创 2020-09-21 17:25:25 · 875 阅读 · 0 评论 -
详解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是与对象监视器配合完成线程间的等待/通知机制,而Cond原创 2020-09-18 16:37:54 · 1153 阅读 · 0 评论 -
LockSupport的park和unpark的基本使用,以及对线程中断的响应性
看到ConditionObject代码中中await方法有用到,做下笔记。/*** Disables the current thread for thread scheduling purposes unless the* permit is available.** <p>If the permit is available then it is consumed and the call returns* immediately; otherwise* the current原创 2020-09-18 16:14:46 · 541 阅读 · 0 评论 -
线程并发安全导致内存溢出
整个网站访问不了,后台日志内存溢出,提出了个致命单。原因:流量统计FlowUtil类使用两个static的List来装载流量信息实体bean。用户每次点击都会将一个产生一个bean并加入到第一个List1中,当List1里的bean到一定数量时(可在后台配置缓存大小),List1将所有的实体bean复制到 List2中,然后List1清空继续接收新的bean,这时List2开启一个新线程异步去将bean插入数据库,然后清空。Method add(bean) { list1.add(原创 2020-09-10 14:23:57 · 492 阅读 · 0 评论 -
线程池的submit和execute方法区别
线程池中的execute方法大家都不陌生,即开启线程执行池中的任务。还有一个方法submit也可以做到,它的功能是提交指定的任务去执行并且返回Future对象,即执行的结果。下面简要介绍一下两者的三个区别:1、接收的参数不一样2、submit有返回值,而execute没有用到返回值的例子,比如说我有很多个做validation的task,我希望所有的task执行完,然后每个task告诉我它的执行结果,是成功还是失败,如果是失败,原因是什么。然后我就可以把所有失败的原因综合起来发给调用者。个人觉得c原创 2020-09-10 08:28:39 · 885 阅读 · 0 评论 -
Thread类中interrupt()、interrupted()和isInterrupted()方法详解
总结,关于这三个方法,interrupt()是给线程设置中断标志;interrupted()是检测中断并清除中断状态;isInterrupted()只检测中断。还有重要的一点就是interrupted()作用于当前线程,interrupt()和isInterrupted()作用于此线程,即代码中调用此方法的实例所代表的线程。-------------------------------------------------------------------------------------------原创 2020-07-16 11:28:48 · 1190 阅读 · 0 评论 -
Java并发之AQS详解
一、概述 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。 以下是本文的目录大纲: 概述 框架 源码详解 简单应用 若有不正之处,请谅解和批评指正,不胜感激。原创 2020-07-13 10:58:20 · 117 阅读 · 0 评论 -
多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask
第一个要讲的就是CyclicBarrier。CyclicBarrier从字面理解是指循环屏障,它可以协同多个线程,让多个线程在这个屏障前等待,直到所有线程都达到了这个屏障时,再一起继续执行后面的动作。看一下CyclicBarrier的使用实例:public static class CyclicBarrierThread extends Thread{ private CyclicBarrier cb; private int sleepSecond; .原创 2020-07-13 09:59:22 · 187 阅读 · 0 评论 -
多线程组件之CountDownLatch、Semaphore、Exchanger
前言在多线程环境下,JDK给开发者提供了许多的组件供用户使用(主要在java.util.concurrent下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码。之前讲过的线程池、BlockingQueue都是在java.util.concurrent下的组件,Timer虽然不在java.util.concurrent下,但也算是。后两篇文章将以例子的形式简单讲解一些多线程下其他组件的使用,不需要多深刻的理解,知道每个组件大致什么作用就行。本文主要讲解的是Count原创 2020-07-13 09:48:48 · 221 阅读 · 0 评论