
并发
文章平均质量分 79
加多
欢迎关注微信公众号 技术原始积累
展开
-
使用ThreadLocal不当可能会导致内存泄露
8.2 使用ThreadLocal不当可能会导致内存泄露基础篇已经讲解了ThreadLocal的原理,本节着重来讲解下使用ThreadLocal会导致内存泄露的原因,并讲解使用ThreadLocal导致内存泄露的案例。8.2.1 为何会出现内存泄露基础篇我们讲到了ThreadLocal只是一个工具类,具体存放变量的是在线程的threadLocals变量里面,threadLo原创 2018-01-15 18:27:58 · 17453 阅读 · 8 评论 -
并发队列-有界阻塞队列ArrayBlockingQueue原理探究
一、 前言上节介绍了无界链表方式的阻塞队列LinkedBlockingQueue,本节来研究下有界使用数组方式实现的阻塞队列ArrayBlockingQueue阿里巴巴长期招聘Java研发工程师p6,p7,p8等上不封顶级别,有意向的可以发简历给我,注明想去的部门和工作地点:1064454834@qq.com二、 ArrayBlockingQueue类图结构原创 2018-01-27 12:12:16 · 349 阅读 · 0 评论 -
并发队列-无界阻塞优先级队列PriorityBlockingQueue原理探究
一、 前言PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高的元素,是二叉树最小堆的实现,研究过数组方式存放最小堆节点的都知道,直接遍历队列元素是无序的。阿里巴巴长期招聘Java研发工程师p6,p7,p8等上不封顶级别,有意向的可以发简历给我,注明想去的部门和工作地点:1064454834@qq.com二、 PriorityBlocking原创 2018-01-27 12:12:57 · 305 阅读 · 0 评论 -
并发队列中迭代器弱一致性原理探究
一、前言并发队列里面的Iterators是弱一致性的,next返回的是队列某一个时间点或者创建迭代器时候的状态的反映。当创建迭代器后,其他线程删除了该元素时候并不会抛出java.util.ConcurrentModificationException异常,能够保持创建迭代器后的元素一定被正确的next出来。阿里巴巴长期招聘Java研发工程师p6,p7,p8等上不封顶级别,有意向的可原创 2018-01-27 12:13:49 · 966 阅读 · 1 评论 -
并发队列-无界阻塞延迟队列DelayQueue原理探究
一、前言DelayQueue队列中每个元素都有个过期时间,并且队列是个优先级队列,当从队列获取元素时候,只有过期元素才会出队列。阿里巴巴长期招聘Java研发工程师p6,p7,p8等上不封顶级别,有意向的可以发简历给我,注明想去的部门和工作地点:1064454834@qq.com二、 DelayQueue类图结构image.png如原创 2018-01-27 12:14:36 · 895 阅读 · 0 评论 -
Java中线程池ThreadPoolExecutor原理探究
一、 前言线程池主要解决两个问题:一方面当执行大量异步任务时候线程池能够提供较好的性能,,这是因为使用线程池可以使每个任务的调用开销减少(因为线程池线程是可以复用的)。另一方面线程池提供了一种资源限制和管理的手段,比如当执行一系列任务时候对线程的管理,每个ThreadPoolExecutor也保留了一些基本的统计数据,比如当前线程池完成的任务数目。另外,线程池提供许多可调参数和可扩原创 2018-01-27 12:15:18 · 320 阅读 · 0 评论 -
Java中调度线程池ScheduledThreadPoolExecutor原理探究
一、 前言前面讲解过Java中线程池ThreadPoolExecutor原理探究,ThreadPoolExecutor是Executors中一部分功能,下面来介绍另外一部分功能也就是ScheduledThreadPoolExecutor的实现,后者是一个可以在一定延迟时候或者定时进行任务调度的线程池。阿里巴巴长期招聘Java研发工程师p6,p7,p8等上不封顶级别,有意向的可以发简原创 2018-01-27 12:15:54 · 331 阅读 · 0 评论 -
使用线程池时候当程序结束时候记得调用shutdown关闭线程池
3.10 使用线程池时候当程序结束时候记得调用shutdown关闭线程池日常开发中为了便于线程的有效复用,线程池是经常会被用的工具,然而线程池使用完后如果不调用shutdown会导致线程池资源一直不会被释放。下面通过简单例子来说明该问题。3.10.1问题复现下面通过一个例子说明当不调用线程池对象的shutdown方法后,当线程池里面的任务执行完毕后主线程这个JVM不会退出。public class...原创 2018-02-22 14:51:59 · 9513 阅读 · 6 评论 -
Java 并发编程之美:并发编程基础晋级篇-chat
借用 Java 并发编程实践中的话;编写正确的程序并不容易,而编写正常的并发程序就更难了;相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的。并发编程相比 Java 中其他知识点学习起来门槛相对较高,学习起来比较费劲,从而导致很多人望而却步;而无论是职场面试和高并发高流量的系统的实现却都还离不开并发编程,从而导致能够...原创 2018-03-19 22:22:23 · 650 阅读 · 0 评论 -
Java 并发编程之美:并发编程高级篇之一-chat
借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了。相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的。并发编程相比 Java 中其他知识点学习起来门槛相对较高,学习起来比较费劲,从而导致很多人望而却步;而无论是职场面试和高并发高流量的系统的实现却都还离不开并发编程,从而导致能够...原创 2018-03-27 13:42:41 · 2101 阅读 · 0 评论 -
Java并发编程之美系列汇总
Java并发编程之美系列汇总,大家可以挑选自己感兴趣的的进行订阅。Java 并发编程之美:线程相关的基础知识 http://gitbook.cn/gitchat/activity/5aa4d205c2ff6f2e120891ddJava 并发编程之美:并发编程基础晋级篇 http://gitbook.cn/gitchat/activity/5aafb17477918b6e8444b65...原创 2018-04-22 19:29:33 · 3902 阅读 · 1 评论 -
并发编程之美-终章chat
一、Java 并发编程之美:并发编程高级篇之五微信扫码二维码加入 本 Chat 作为 Java 并发编程之美系列的高级篇之五,讲解JUC包中提供的三种线程同步器的使用与原理分析内容如下:(建议先阅读 并发编程高级篇之三-锁 )JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 CountDownLatch 是比调用线程的 ...原创 2018-04-20 18:16:38 · 1569 阅读 · 0 评论 -
Java并发编程之美
一、前言并发编程相比 Java 中其他知识点学习门槛较高,从而导致很多人望而却步。但无论是职场面试,还是高并发/高流量的系统的实现,却都离不开并发编程,于是能够真正掌握并发编程的人成为了市场迫切需求的人才。本书将通过图文结合、通俗易懂的方式帮助大家完成多线程并发编程从入门到实践的飞跃!本书分为三部分: - 第一部分Java并发编程基础篇主要讲解Java并发编程的基础知识,主要讲解线程有关...原创 2018-09-01 15:21:57 · 5604 阅读 · 6 评论 -
Java并发编程之美-勘误
Java并发编程之美-勘误汇总原创 2018-09-17 10:27:10 · 2210 阅读 · 0 评论 -
Java 并发编程之美-千呼万唤始出来
一、内容二、买家秀三、购买地址京东链接: https://item.jd.com/12450812.html天猫链接:https://detail.tmall.com/item.htm?spm=a230r.1.14.1.606745bbXzjEyK&id=578523567332&ns=1&abbucket=17...原创 2018-10-20 11:15:22 · 1054 阅读 · 0 评论 -
Java并发编程之美-双11限时五折优惠
一、内容二、买家秀三、购买地址天猫链接:https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.61.59a73c85cVE3Sk&id=579705310959&user_id=1932014659&cat_id=2&is_b=1&rn=8030c6abc3a06ef8b8e6...原创 2018-11-11 17:27:28 · 531 阅读 · 1 评论 -
JUC包中的分而治之策略-为提高性能而生
一、前言本次分享我们来共同探讨JUC包中一些有意思的类,包含AtomicLong & LongAdder,ThreadLocalRandom原理。二、AtomicLong & LongAdder2.1 AtomicLong 类AtomicLong是JUC包提供的原子性操作类,其内部通过CAS保证了对计数的原子性更新操作。大家可以翻看源码发现内部是通过UnSafe(rt.j...原创 2019-01-12 09:28:15 · 993 阅读 · 0 评论 -
并发队列-无界阻塞队列LinkedBlockingQueue原理探究
一、前言前面介绍了使用CAS实现的非阻塞队列ConcurrentLinkedQueue,下面就来介绍下使用独占锁实现的阻塞队列LinkedBlockingQueue的实现二、 LinkedBlockingQueue类图结构image.png如图LinkedBlockingQueue中也有两个Node分别用来存放首尾节点,并且里面有个初始值原创 2018-01-27 12:11:30 · 328 阅读 · 0 评论 -
并发队列-无界非阻塞队列ConcurrentLinkedQueue原理探究
一、 前言常用的并发队列有阻塞队列和非阻塞队列,前者使用锁实现,后者则使用CAS非阻塞算法实现,使用非阻塞队列一般性能比较好,下面就看看常用的非阻塞ConcurrentLinkedQueue是如何使用CAS实现的。二、 ConcurrentLinkedQueue类图结构image.png如图ConcurrentLinkedQu原创 2018-01-27 12:10:45 · 404 阅读 · 0 评论 -
一个有关定时生产与消费的问题
一、前言本文来讲解遇到的一个有意思的与定时器相关的生产消费模型,模型如下图:image.png生产者是一个定时器线程,使用ScheduledThreadPoolExecutor的scheduleAtFixedRate控制每间隔3s投递一个元素到队列1,2,3(使用offer方法)。比如第1s放入一个元素到队列1,2,3,这时候每个队列里面原创 2018-01-27 12:09:09 · 319 阅读 · 0 评论 -
一个有关定时生产与消费的问题
一、前言本文来讲解遇到的一个有意思的与定时器相关的生产消费模型,模型如下图:image.png生产者是一个定时器线程,使用ScheduledThreadPoolExecutor的scheduleAtFixedRate控制每间隔3s投递一个元素到队列1,2,3(使用offer方法)。比如第1s放入一个元素到队列1,2,3,这时候每个队列原创 2018-01-31 09:51:51 · 421 阅读 · 0 评论 -
基于信号量的生产消费模型
一、前言上篇 https://www.jianshu.com/p/6402676abc86 文章讲解了一个定时生产消费时候消费队列里面最多有几个元素的问题。本文来探讨另外一个问题,由于生产和消费线程执行的不确定性,会产生当生产线程t1时间投递任务到队列后,消费线程可能在t1+1左右时候才会开始消费其中的一个队列,也就是生产与消费之间会有1s时间的的间隔,那么有没有办法保证生产线程t1时间投原创 2018-01-31 09:52:27 · 312 阅读 · 0 评论 -
并发包中ThreadLocalRandom类原理剖析
2.2、 并发包中ThreadLocalRandom类原理剖析ThreadLocalRandom类是JDK7在JUC包下新增的随机数生成器,它解决了Random类在多线程下多个线程竞争内部唯一的原子性种子变量而导致大量线程自旋重试的不足。本节首先讲解下Random类的实现原理已经它在多线程下使用的局限性,然后引入ThreadLocalRandom类,通过讲解ThreadLocalRan原创 2018-01-16 12:43:28 · 695 阅读 · 0 评论 -
ThreadLocal原理探究
2.1.11 ThreadLocal多线程访问同一个共享变量特别容易出现并发问题,特别是多个线程需要对一个共享变量进行写入时候,为了保证线程安全,一般需要使用者在访问共享变量的时候进行适当的同步,如下图:image.pngimage.png2.1.11.1 ThreadLocal使用实例本节来看下T原创 2018-01-16 12:40:42 · 334 阅读 · 0 评论 -
伪共享
2.2.9 伪共享2.2.9.1什么是伪共享计算机系统中为了解决主内存与CPU运行速度的差距,在CPU与主内存之间添加了一级或者多级高速缓冲存储器(Cache),这个Cache一般是集成到CPU内部的,所以也叫 CPU Cache,如下图是两级cache结构:image.pngCache内部是按行存储的,其中每一行称为一个cache行,c原创 2018-01-16 12:44:11 · 542 阅读 · 0 评论 -
线程不安全的SimpleDateFormat
8.5 SimpleDateFormat是线程不安全的SimpleDateFormat是Java提供的一个格式化和解析日期的工具类,日常开发中应该经常会用到,但是由于它是线程不安全的,多线程公用一个SimpleDateFormat实例对日期进行解析或者格式化会导致程序出错,本节就讨论下它为何是线程不安全的,以及如何避免。问题复现为了复现该问题,编写如下代码: pub原创 2018-01-16 12:45:06 · 266 阅读 · 0 评论 -
线程池使用FutureTask时候需要注意的一点事
8.4 线程池使用FutureTask时候需要注意的一点事线程池使用FutureTask的时候如果拒绝策略设置为了 DiscardPolicy和DiscardOldestPolicy并且在被拒绝的任务的Future对象上调用无参get方法那么调用线程会一直被阻塞。问题复现下面就通过一个简单的例子来复现问题:public class FutureTest {原创 2018-01-16 12:45:57 · 5815 阅读 · 0 评论 -
java中守护线程与用户线程
Java线程分为两类分别为daemon线程(守护线程)和User线程(用户线程),在JVM启动时候会调用main函数,main函数所在的线程是一个用户线程,这个是我们可以看到的线程,其实JVM内部同时还启动了好多守护线程,比如垃圾回收线程。那么守护线程和用户线程有什么区别那?区别之一是当最后一个非守护线程结束时候,JVM会正常退出,而不管当前是否有守护线程,也就是说守护线程是否结束并不影响JVM的原创 2018-01-16 12:48:24 · 912 阅读 · 0 评论 -
JDK8中新增原子性操作类LongAdder
LongAdder简单介绍LongAdder类似于AtomicLong是原子性递增或者递减类,AtomicLong已经通过CAS提供了非阻塞的原子性操作,相比使用阻塞算法的同步器来说性能已经很好了,但是JDK开发组并不满足,因为在非常高的并发请求下AtomicLong的性能不能让他们接受,虽然AtomicLong使用CAS但是CAS失败后还是通过无限循环的自旋锁不断尝试的 pu原创 2018-01-16 12:49:46 · 1607 阅读 · 0 评论 -
JDK8中新增原子性操作类LongAccumulator
一、 LongAccumulator类原理探究LongAdder类是LongAccumulator的一个特例,LongAccumulator提供了比LongAdder更强大的功能,如下构造函数其中accumulatorFunction一个双目运算器接口,根据输入的两个参数返回一个计算值,identity则是LongAccumulator累加器的初始值。 public LongAc原创 2018-01-16 12:50:19 · 1235 阅读 · 0 评论 -
JDK8并发包新增StampedLock锁
4.8 JDK8新增的StampedLock锁探究StampedLock是并发包里面jdk8版本新增的一个锁,该锁提供了三种模式的读写控制,三种模式分别如下:写锁writeLock,是个排它锁或者叫独占锁,同时只有一个线程可以获取该锁,当一个线程获取该锁后,其它请求的线程必须等待,当目前没有线程持有读锁或者写锁的时候才可以获取到该锁,请求该锁成功后会返回一个stamp票据变量用来表原创 2018-01-17 09:40:31 · 387 阅读 · 0 评论 -
受限访问量问题中锁的使用
一、 前言最近在做网上法庭的一个比较有意思的小需求,就是通过扫二维码方式允许最多30个人同时进入庭审,但是不限制进入的是是不是庭审人员,也就是说只要扫了这个二维码并且当前案件对应的参与人数不到30那么就可以进入,始终维持一个庭审案件里面最多有30人。二、 方案研究扫描二维码会调用后台的一个rpc,而Rpc会调用bo方法进行处理,那么下面就研究下bo里面里面怎么做。由原创 2018-01-25 12:25:37 · 287 阅读 · 0 评论 -
基于rxjava的生产消费模型
一、前言最近在看springcloud的熔断机制的实现,发现底层使用的rxjava实现,就看了下rxjava的使用,发现rxjava使用可也便捷实现前面讲解的定时生产与消费。二、rxjava版生产消费实现在简单抽象下要实现的功能,定时器线程间隔3秒生成一个任务,假如任务里面有3个子任务,则消费线程要分3秒,每秒消费一个子任务。image.pn原创 2018-02-02 19:03:51 · 685 阅读 · 0 评论 -
高并发编程必备基础
一、前言借用Java并发编程实践中的话”编写正确的程序并不容易,而编写正常的并发程序就更难了”,相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的,本文算是对多线程情况下同步策略的一个简单介绍。二、 什么是线程安全问题线程安全问题是指当多个线程同时读写一个状态变量,并且没有任何同步措施时候,导致脏数据或者其他不可预见的结原创 2018-01-19 09:38:49 · 922 阅读 · 1 评论 -
FutureTask 原理
二十、FutureTask 原理20.1 一个例子 static class Task implements CallableInteger> { @Override public Integer call() throws Exception { System.out.println("子线程在进行计算");原创 2018-01-19 09:40:04 · 465 阅读 · 0 评论 -
什么是重排序问题
十七、 什么是重排序问题Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序可以保证最终执行的结果是与程序顺序执行的结果一致,并且只会对不存在数据依赖性的指令进行重排序,这个重排序在单线程下对最终执行结果是没有影响的,但是在多线程下就会存在问题。一个例子int a = 1;(1)int b = 2;(2)int c= a + b;(3)如上c的值依赖a和b的值,所以重排序后能够原创 2018-01-19 09:40:52 · 1446 阅读 · 1 评论 -
Java并发编程视频分享-第一期
一、主讲人:加多(阿里集团-淘宝技术部-高级开发工程师)**本名:**翟陆续目前在阿里巴巴淘宝移动中间件消息服务组工作,热衷并发编程,开源框架,架构设计。著作:《Java并发编程之美》二、本次课程内容:什么是线程?并发与并行区别?为何并发编程那么难?1.数据竞争的存在 2.原子性 3.指令重排序存在 4.死锁的存在 5.内存可见性问题的存在三、直播时间:2019年3月1...原创 2019-03-17 09:59:12 · 1607 阅读 · 0 评论