![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发多线程
文章平均质量分 86
Mr小林
软件工程师的成才之路。
展开
-
Volatile详解,太详细了
Volatile可能是面试里面必问的一个话题吧,对他的认知很多朋友也仅限于会用阶段,今天我们换个角度去看看。先来跟着丙丙来看一段demo的代码:你会发现,永远都不会输出有点东西这一段代码,按道理线程改了flag变量,主线程也能访问到的呀?为会出现这个情况呢?那我们就需要聊一下另外一个东西了。JMM(JavaMemoryModel)JMM:Java内存模型,是java虚拟机规范中所定义的一种内存模型,Java内存模型是标准化的,屏蔽掉了底层不同计算机的区别(注意这个跟JVM转载 2022-04-07 20:36:47 · 18203 阅读 · 3 评论 -
ReentrantReadWriteLock读写锁详解
一、读写锁简介 现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了。 针对这种场景,JAVA的并发包提供了读写锁ReentrantReadWriteLock,它表示两个锁,一个是读操作相关的锁,称为共享锁;一个是写相关的锁,称为排他锁,描述如下:线程进入读锁的前提条件:没有其他线程的写锁..转载 2022-04-06 09:46:20 · 1106 阅读 · 0 评论 -
AQS一行一行源码分析清楚 AbstractQueuedSynchronizer(二)
文章比较长,信息量比较大,建议在 pc 上阅读。文章标题是为了呼应前文,其实可以单独成文的,主要是希望读者看文章能系统看。本文关注以下几点内容:深入理解 ReentrantLock 公平锁和非公平锁的区别 深入分析 AbstractQueuedSynchronizer 中的 ConditionObject 深入理解 Java 线程中断和 InterruptedException 异常基本上本文把以上几点都说清楚了,我假设读者看过上一篇文章中对 AbstractQueuedSynchronize转载 2022-04-02 16:44:48 · 127 阅读 · 0 评论 -
如何设置线程池参数?美团给出了一个让面试官虎躯一震的回答。
荒腔走板大家好,我是 why,一个四川好男人。今天本来应该是武汉马拉松鸣枪起跑的日子,所以先荒腔走板说几句马拉松吧。上面的图是我跑 2019 年成都马拉松的时候拍的,是一对双胞胎陪着 80 岁的父亲跑全程马拉松。图片中的老人叫罗广德,在他 75 岁之前的人生和其他的老人并无不同。但是经过他儿子的影响,在 75 岁的时候开始接触跑步的。一直就没有停下脚步,世界六大马拉松赛(纽约、伦敦、柏林、芝加哥、东京、波士顿)他已经完成了五个。本来打算今年 4 月份站上波士顿马拉转载 2022-01-25 17:11:16 · 630 阅读 · 0 评论 -
头条二面:你确定 ThreadLocal 真的会造成内存泄露?
ThreadLocal 是 Java面试过程中的“钉子户”,在网上也充斥着各种有关ThreadLocal内存泄露的问题。本文换个角度,先思考 ThreadLocal体系中的 ThreadLocalMap 为什么要设计成弱引用。1. ThreadLocal 知识体系本文还是不能免俗,在回答这个问题之前需要先和大家介绍一下 ThreadLocal 的知识,使大家对 ThreadLocal 有一个相对全面的认识。ThreadLocal 本地线程变量,主要用于解决数据访问的竞争,通常用于多.转载 2021-12-31 17:39:29 · 146 阅读 · 0 评论 -
漏桶算法和令牌桶算法,区别到底在哪里?
漏桶算法和令牌桶算法是接口限流设计中常用的两种算法,网上关于这两个算法的介绍文章有很多,但不同的人有不同的理解,导致很多技术人员在学习的时候,会陷入迷茫的状态,比如说:1)如果要让自己的系统不被打垮,用令牌桶。如果保证别人的系统不被打垮,用漏桶算法;参考链接2)在“令牌桶算法”中,只要令牌桶中存在令牌,那么就允许突发地传输数据直到达到用户配置的门限,所以它适合于具有突发特性的流量。参考链接我在架构实战营中总结两种算法的技术本质和优缺点分别如下:大家会看到,与网上的一些文章对比转载 2021-11-19 14:06:13 · 319 阅读 · 0 评论 -
多线程CompletableFuture
自己在项目中使用CompletableFuture比较多,看到很多开源框架中也大量使用到了CompletableFuture。因此,专门写一篇文章来介绍这个 Java 8 才被引入的一个非常有用的用于异步编程的类。简单介绍CompletableFuture同时实现了Future和CompletionStage接口。public class CompletableFuture<T> implements Future<T>, CompletionSt...转载 2021-10-18 14:44:03 · 1578 阅读 · 0 评论 -
Http请求并发高时报Connection reset错误
1、报错信息:2021-07-14 10:03:16,318 ERROR [WebContainer : 39] [com.elitecrm.webchat.util.PoolingHttpService] - java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:221) ~[?:1.8.0] at java.net.SocketInputStre原创 2021-07-20 09:22:14 · 3637 阅读 · 0 评论 -
【Java面试】Java并发之面试题
目录1、在 java 中守护线程和本地线程区别?2、线程与进程的区别?3、什么是多线程中的上下文切换?4、死锁与活锁的区别,死锁与饥饿的区别?6、什么是线程组,为什么在 Java 中不推荐使用?7、为什么使用 Executor 框架?8、在 Java 中 Executor 和 Executors 的区别?9、如何在 Windows 和 Linux 上查找哪个线程使用的 CPU 时间最长?10、什么是原子操作?在 Java Concurrency API 中有哪些原子类(a转载 2020-11-23 14:11:24 · 184 阅读 · 1 评论 -
Java多线程AQS调用 三个天气服务商,看那个返回的快用哪个
三个天气服务商,看那个返回的快用哪个import lombok.SneakyThrows;import java.util.Random;import java.util.concurrent.*;import java.util.concurrent.atomic.AtomicBoolean;public class HXWait { public static void main(String[] args) throws ExecutionException, Interr原创 2020-11-19 14:08:40 · 205 阅读 · 0 评论 -
使用Netty如何做到单机秒级接收35万个对象
单纯netty结合protostuff进行rpc对象传输的demo网上有很多,大部分都是一个模子刻出来的,一开始我也是抄了一个,本地测试畅通无阻,未发生任何异常。部署预发环境,进行压测后,问题巨多,各种报错层出不穷。当然,压测时我用的数据量大、发送请求非常密集,单机是每秒前100ms发送2万个对象,其他900ms歇息,死循环发送,共计40台机器作为客户端,同时往2台netty Server服务器发送对象,那么平均每个server每秒大概要接收40万个对象,由于后面还有业务逻辑,逻辑每秒只能处理35万实测转载 2020-09-18 17:13:01 · 168 阅读 · 0 评论 -
TPS和QPS概念理解
TPS:是Transactions Per Second的缩写,也就是bai事务数/秒。du它是软件测试结果的测量单位。一个事zhi务是指一个客户机向服务器发送dao请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。QPS:是Queries Per Second的缩写,意思是每秒查询率,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。区别及理解:1、TPS即每秒处理事务数,包原创 2020-06-12 13:11:01 · 543 阅读 · 0 评论 -
面试官:小伙子,听说你看过ThreadLocal源码?(万字图文深度解析ThreadLocal)
这次趁热打铁再写一篇ThreadLocal的文章,同样是深入原理,图文并茂。全文共10000+字,31张图,这篇文章同样耗费了不少的时间和精力才创作完成,原创不易,请大家点点关注+在看,感谢。对于ThreadLocal,大家的第一反应可能是很简单呀,线程的变量副本,每个线程隔离。那这里有几个问题大家可以思考一下:ThreadLocal的key是弱引用,那么在 threadLocal.get()的时候,发生GC之后,key是否为null? ThreadLocal中ThreadLocalMap的数转载 2020-05-11 09:15:50 · 233 阅读 · 0 评论 -
JAVA多线程和并发基础面试问答
1. 进程和线程之间有什么不同?一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。2. 多线程编程的好处是什么?在多线程程序中,多个线程被并发的执行以提高程序...转载 2020-05-06 10:01:28 · 125 阅读 · 0 评论 -
Java 并发进阶常见面试题总结
Java 并发进阶常见面试题总结1. synchronized 关键字1.1. 说一说自己对于 synchronized 关键字的了解synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。另外,在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器...转载 2020-04-29 14:49:20 · 210 阅读 · 0 评论 -
吞吐量QPS、TPS、并发数、响应时间RT
一、概念:1、响应时间(RT)响应时间是指系统对请求作出响应的时间。直观上看,这个指标与人对软件性能的主观感受是非常一致的,因为它完整地记录了整个计算机系统处理请求的时间。由于一个系统通常会提供许多功能,而不同功能的处理逻辑也千差万别,因而不同功能的响应时间也不尽相同,甚至同一功能在不同输入数据的情况下响应时间也不相同。所以,在讨论一个系统的响应时间时,人们通常是指该系统所有功能的平均时间...转载 2020-04-27 13:26:15 · 1264 阅读 · 0 评论 -
Java线程池拒绝策略
前言线程池,相信很多人都有用过,没用过相信的也有学习过。但是,线程池的拒绝策略,相信知道的人会少许多。四种线程池拒绝策略当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize时,如果还有任务到来就会采取任务拒绝策略,通常有以下四种策略:ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionE...转载 2020-03-30 22:34:52 · 173 阅读 · 0 评论 -
JUC并发Atomic原子类介绍
1 Atomic 原子类介绍Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。所以,所谓原子类说简单点就是具有原子/原子操作特征的类。并发包java.util.concurrent的原子类都存放在j...原创 2020-03-09 19:44:13 · 215 阅读 · 0 评论 -
Java的Future 详解,获取线程池执行结果
1. Future的应用场景在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不管是继承thread类还是实现runnable接口,都无法保证获取到之前的执行结果。通过实现Callback接口,并用Future可以来接收多线程的执行结果。Future表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加Callback以便在任务执行成功...转载 2020-03-03 09:32:54 · 4814 阅读 · 0 评论 -
java的两种可重入锁
可重入锁可重入锁也叫递归锁,它俩等同于一回事,指的是同一线程外层函数获得锁之后,内层递归函数仍然能获得该锁的代码,同一线程在外层方法获取锁的时候,再进入内层方法会自动获取锁。也就是说,线程可以进入任何一个它已经拥有的锁所同步着的代码块。ReentrantLock 和 synchronized 就是典型的可重入锁!看了上面的解释是不是一脸懵逼,举个通俗易懂的例子来看一下,上代码!(1). 基于 ...转载 2020-02-29 21:18:38 · 198 阅读 · 0 评论 -
继承Thread类和实现Runnable之间的区别
线程的起动并不是简单的调用了你的RUN方法,而是由一个线程调度器来分别调用你的所有线程的RUN方法,我们普通的RUN方法如果没有执行完是不会返回的,也就是会一直执行下去,这样RUN方法下面的方法就不可能会执行了,可是线程里的RUN方法却不一样,它只有一定的CPU时间,执行过后就给别的线程了,这样反复的把CPU的时间切来切去,因为切换的速度很快,所以我们就感觉是很多线程在同时运行一样. 你简单的调用...转载 2018-04-03 14:21:48 · 840 阅读 · 1 评论 -
线程池
一般:长连接10个,线程池数量定为16,队列长度设为100,超过队列则拒绝。线程池究竟设成多大是要看你给线程池处理什么样的任务,任务类型不同,线程池大小的设置方式也是不同的。任务一般可分为:CPU密集型、IO密集型、混合型,对于不同类型的任务需要分配不同大小的线程池。CPU密集型任务 尽量使用较小的线程池,一般为CPU核心数+1。 因为CPU密集型任务使得CPU使用率很高,若开过多的线程数,只能增...原创 2018-04-02 11:31:20 · 530 阅读 · 0 评论 -
分布式事务
分布式事务:两个项目通过MQ连接,每个项目的service都有各自的事务,一个项目1执行成功会通过MQ发消息执行另个项目2中的业务代码,如果2另一个项目报错,则他自己会事务回滚。然后让MQ抛一个异常,进而使第一个项目1发生事务回滚。同步事务:用的dubbo,当前工程加一个事务用dubbo去调用另外的项目,返回响应成功的话则事务执行成功,失败的话事务回滚 ...原创 2018-04-02 10:52:37 · 152 阅读 · 0 评论