![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
文章平均质量分 94
Java_supermanNO1
这个作者很懒,什么都没留下…
展开
-
系统性能百倍提升典型案例分析:高性能队列Disruptor
Disruptor 是一款高性能的有界内存队列,目前应用非常广泛,Log4j2、SpringMessaging、HBase、Storm 都用到了 Disruptor,那 Disruptor 的性能为什么这么高呢?Disruptor 项目团队曾经写过一篇论文,详细解释了其原因,可以总结为如下:内存分配更加合理,使用 RingBuffer 数据结构,数组元素在初始化时一次性全部创建,提升缓存命中率;对象循环利用,避免频繁 GC。能够避免伪共享,提升缓存利用率。3. 采用无锁算法,避免频繁加锁、解锁的性能消原创 2021-03-26 20:48:50 · 505 阅读 · 1 评论 -
并发编程经典案例分析:高性能限流器Guava RateLimiter
Guava 是Google 开源的 Java 类库,提供了一个工具类 RateLimiter。我们先来看看 RateLimiter的使用,让你对限流有个感官的印象。假设我们有一个线程池,它每秒只能处理两个任务,如果提交的任务过快,可能导致系统不稳定,这个时候就需要用到限流。在下面的示例代码中,我们创建了一个流速为 2 个请求 / 秒的限流器,这里的流速该怎么理解呢?直观地看,2 个请求 / 秒指的是每秒最多允许 2 个请求通过限流器,其实在Guava中,流速还有更深一层的意思:是一种匀速的概念,2 个请求原创 2021-03-21 22:09:31 · 411 阅读 · 0 评论 -
你的线程很可能出现了:安全性、活跃性以及性能问题
并发编程中我们需要注意的问题有很多,很庆幸前人已经帮我们总结过了,主要有三个方面,分别是:安全性问题、活跃性问题和性能问题。下面我就来一一介绍这些问题。安全性问题相信你一定听说过类似这样的描述:这个方法不是线程安全的,这个类不是线程安全的,等等。那什么是线程安全呢?其实本质上就是正确性,而正确性的含义就是程序按照我们期望的执行,不要让我们感到意外。在上一篇《深入底层探究并发编程Bug罪魁祸首——可见性、原子性、有序性 》中,我们已经见识过很多诡异的 Bug,都是出乎我们预料的,它们都没有按.原创 2021-03-20 22:41:38 · 216 阅读 · 0 评论 -
Java架构进阶笔记:一不小心就死锁了,怎么办?
我们用 Account.class 作为互斥锁,来解决银行业务里面的转账问题,虽然这个方案不存在并发问题,但是所有账户的转账操作都是串行的,例如账户 A 转账户 B、账户 C 转账户 D 这两个转账操作现实世界里是可以并行的,但是在这个方案里却被串行化了,这样的话,性能太差。试想互联网支付盛行的当下,8 亿网民每人每天一笔交易,每天就是 8 亿笔交易;每笔交易都对应着一次转账操作,8 亿笔交易就是 8 亿次转账操作,也就是说平均到每秒就是近 1万次转账操作,若所有的转账操作都串行,性能完全不能接受。那下原创 2021-03-19 12:04:03 · 162 阅读 · 0 评论 -
深入底层探究并发编程Bug罪魁祸首——可见性、原子性、有序性
如果你细心观察的话,你会发现,不管是哪一门编程语言,并发类的知识都是在高级篇里。换句话说,这块知识点其实对于程序员来说,是比较进阶的知识。我自己这么多年学习过来,也确实觉得并发是比较难的,因为它会涉及到很多的底层知识,比如若你对操作系统相关的知识一无所知的话,那去理解一些原理就会费些力气。大家都知道,编写正确的并发程序是一件极困难的事情,并发程序的 Bug 往往会诡异地出现,然后又诡异地消失,很难重现,也很难追踪,很多时候都让人很抓狂。但要快速而又精准地解决“并发”类的疑难杂症,你就要理解这件事情的本质,原创 2021-03-10 21:09:57 · 203 阅读 · 0 评论 -
致2020,这可能是把“并发容器”总结最详细的文章了
本文转载自:致2020,这可能是把“并发容器”总结最详细的文章了一、JDK 提供的并发容器总结JDK 提供的这些容器大部分在 java.util.concurrent 包中。ConcurrentHashMap: 线程安全的 HashMapCopyOnWriteArrayList: 线程安全的 List,在读多写少的场合性能非常好,远远好于 Vector.ConcurrentLinke...原创 2020-02-19 17:56:26 · 271 阅读 · 0 评论 -
JVM、并发编程、函数式编程思维导图分享,简单明了
本文转载自:JVM、并发编程、函数式编程思维导图分享,简单明了一、JVM1. 运行时数据区域线程私有线程共享2. 溢出堆溢出栈溢出方法区溢出直接内存溢出3. 垃圾回收对象生命周期垃圾收集算法垃圾收集器内存分配回收策略二、并发编程1. 并发工具AQSReentrantLockReadWriteLockSemaphoreCountDownL ...原创 2020-02-13 20:43:42 · 476 阅读 · 0 评论 -
阿里Java面试题解析——多线程和并发面试题『源码解析』
本文转载自:阿里Java面试题解析——多线程和并发面试题『源码解析』1. DeplayQueue延时无界阻塞队列在谈到DelayQueue的使用和原理的时候,我们首先介绍一下DelayQueue,DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的Delayed元素。DelayQueue阻塞队列在我们系统开发中也常常会用到,例如:...原创 2019-10-23 15:01:47 · 370 阅读 · 0 评论 -
Java程序员面试跳槽涨薪必备——多线程和并发,面个阿里P6轻轻松
本文转载自:Java程序员面试跳槽涨薪必备——多线程和并发,面个阿里P6轻轻松一. ThreadLocal 的原理ThreadLocal 相当于一个容器, 用于存放每个线程的局部变量。 ThreadLocal 实例通常来说都是 private static 类型的。 ThreadLocal 可以 给一个初始值,而每个线程都会获得这个初始化值的一个副本,这样才能保证 不同的线程都有一份拷贝。...原创 2019-10-15 15:44:32 · 437 阅读 · 1 评论 -
Java高并发——并发策略
1 线程安全性如果要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是共享的可变状态的访问。‘共享’意味着变量可以有多个线程同时访问。‘可变’意味着变量的值在他的生命周期中可以发生变化。要想对象是线程安全的,需要使用同步机制来协同对对象可变状态的访问。线程安全最核心的概念就是正确性。当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么这个类便是一个线程安全类。...原创 2019-09-25 15:06:48 · 362 阅读 · 1 评论 -
Java高并发——设计线程安全的类
设计线程安全的类将现有的线程安全的组件组合为更大规模的组件或程序。通过使用封装技术可以使得在不对整个程序进行分析的情况下就可以判断一个类是否是线程安全的。1 基本要素1.1 找出对象状态的所有变量如果对象中所有的域都是基本类型的变量,那么这些域将构成对象的全部状态 如果对象的域中引用了其他对象,那么改对象的状态包括被引用的对象的域final域越多越能简化对象可能状态的分析过程...原创 2019-09-24 16:12:42 · 162 阅读 · 0 评论 -
Java高并发——性能与可伸缩性
一、性能和可伸缩性线程最主要的目的是提高系统的运行性能。始终要把安全性放在第一位,首先保证线程的安全性,只有在程序有性能要求时,才进行进一步的性能优化。1 性能与可伸缩性对于服务器应用程序来说,“多少”这个方面比“多块”这个方面更受重视。当进行决策时,有时候会通过增加某种形式的成本来降低另一种形式的开销。1.1 性能当进行性能调优时,其目的是用更小的代价完成相同的工作。...原创 2019-09-24 16:08:35 · 147 阅读 · 0 评论 -
阿里架构师详解:Java并发编程——内存模型
一、并发编程基础概念并发——在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行——源自百度百科在并发编程中,我们需要处理两个关键问题:线程之间如何通信和线程之间如何同步,后续篇章将围绕这两个问题进行介绍。线程通信:是指线程之间以何种机制来交换信息,在命令式编程中,线程之间的通信机制有两种:...转载 2019-09-18 15:45:42 · 132 阅读 · 0 评论