并发编程
文章平均质量分 83
并发编程系列
加多
欢迎关注微信公众号 技术原始积累
展开
-
基于rxjava的生产消费模型
一、前言最近在看springcloud的熔断机制的实现,发现底层使用的rxjava实现,就看了下rxjava的使用,发现rxjava使用可也便捷实现前面讲解的定时生产与消费。二、rxjava版生产消费实现在简单抽象下要实现的功能,定时器线程间隔3秒生成一个任务,假如任务里面有3个子任务,则消费线程要分3秒,每秒消费一个子任务。image.pn原创 2018-02-02 19:03:51 · 652 阅读 · 0 评论 -
一个有关定时生产与消费的问题
一、前言本文来讲解遇到的一个有意思的与定时器相关的生产消费模型,模型如下图:image.png生产者是一个定时器线程,使用ScheduledThreadPoolExecutor的scheduleAtFixedRate控制每间隔3s投递一个元素到队列1,2,3(使用offer方法)。比如第1s放入一个元素到队列1,2,3,这时候每个队列原创 2018-01-31 09:51:51 · 391 阅读 · 0 评论 -
基于信号量的生产消费模型
一、前言上篇 https://www.jianshu.com/p/6402676abc86 文章讲解了一个定时生产消费时候消费队列里面最多有几个元素的问题。本文来探讨另外一个问题,由于生产和消费线程执行的不确定性,会产生当生产线程t1时间投递任务到队列后,消费线程可能在t1+1左右时候才会开始消费其中的一个队列,也就是生产与消费之间会有1s时间的的间隔,那么有没有办法保证生产线程t1时间投原创 2018-01-31 09:52:27 · 279 阅读 · 0 评论 -
高并发编程必备基础
一、前言借用Java并发编程实践中的话”编写正确的程序并不容易,而编写正常的并发程序就更难了”,相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的,本文算是对多线程情况下同步策略的一个简单介绍。二、 什么是线程安全问题线程安全问题是指当多个线程同时读写一个状态变量,并且没有任何同步措施时候,导致脏数据或者其他不可预见的结原创 2018-01-19 09:38:49 · 874 阅读 · 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 · 427 阅读 · 0 评论 -
什么是重排序问题
十七、 什么是重排序问题Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序可以保证最终执行的结果是与程序顺序执行的结果一致,并且只会对不存在数据依赖性的指令进行重排序,这个重排序在单线程下对最终执行结果是没有影响的,但是在多线程下就会存在问题。一个例子int a = 1;(1)int b = 2;(2)int c= a + b;(3)如上c的值依赖a和b的值,所以重排序后能够原创 2018-01-19 09:40:52 · 1409 阅读 · 1 评论 -
受限访问量问题中锁的使用
一、 前言最近在做网上法庭的一个比较有意思的小需求,就是通过扫二维码方式允许最多30个人同时进入庭审,但是不限制进入的是是不是庭审人员,也就是说只要扫了这个二维码并且当前案件对应的参与人数不到30那么就可以进入,始终维持一个庭审案件里面最多有30人。二、 方案研究扫描二维码会调用后台的一个rpc,而Rpc会调用bo方法进行处理,那么下面就研究下bo里面里面怎么做。由原创 2018-01-25 12:25:37 · 258 阅读 · 0 评论 -
一个有关定时生产与消费的问题
一、前言本文来讲解遇到的一个有意思的与定时器相关的生产消费模型,模型如下图:image.png生产者是一个定时器线程,使用ScheduledThreadPoolExecutor的scheduleAtFixedRate控制每间隔3s投递一个元素到队列1,2,3(使用offer方法)。比如第1s放入一个元素到队列1,2,3,这时候每个队列里面原创 2018-01-27 12:09:09 · 276 阅读 · 0 评论 -
并发队列-无界非阻塞队列ConcurrentLinkedQueue原理探究
一、 前言常用的并发队列有阻塞队列和非阻塞队列,前者使用锁实现,后者则使用CAS非阻塞算法实现,使用非阻塞队列一般性能比较好,下面就看看常用的非阻塞ConcurrentLinkedQueue是如何使用CAS实现的。二、 ConcurrentLinkedQueue类图结构image.png如图ConcurrentLinkedQu原创 2018-01-27 12:10:45 · 369 阅读 · 0 评论 -
并发队列-无界阻塞队列LinkedBlockingQueue原理探究
一、前言前面介绍了使用CAS实现的非阻塞队列ConcurrentLinkedQueue,下面就来介绍下使用独占锁实现的阻塞队列LinkedBlockingQueue的实现二、 LinkedBlockingQueue类图结构image.png如图LinkedBlockingQueue中也有两个Node分别用来存放首尾节点,并且里面有个初始值原创 2018-01-27 12:11:30 · 279 阅读 · 0 评论 -
并发队列-有界阻塞队列ArrayBlockingQueue原理探究
一、 前言上节介绍了无界链表方式的阻塞队列LinkedBlockingQueue,本节来研究下有界使用数组方式实现的阻塞队列ArrayBlockingQueue阿里巴巴长期招聘Java研发工程师p6,p7,p8等上不封顶级别,有意向的可以发简历给我,注明想去的部门和工作地点:1064454834@qq.com二、 ArrayBlockingQueue类图结构原创 2018-01-27 12:12:16 · 315 阅读 · 0 评论 -
并发队列-无界阻塞优先级队列PriorityBlockingQueue原理探究
一、 前言PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高的元素,是二叉树最小堆的实现,研究过数组方式存放最小堆节点的都知道,直接遍历队列元素是无序的。阿里巴巴长期招聘Java研发工程师p6,p7,p8等上不封顶级别,有意向的可以发简历给我,注明想去的部门和工作地点:1064454834@qq.com二、 PriorityBlocking原创 2018-01-27 12:12:57 · 279 阅读 · 0 评论 -
并发队列中迭代器弱一致性原理探究
一、前言并发队列里面的Iterators是弱一致性的,next返回的是队列某一个时间点或者创建迭代器时候的状态的反映。当创建迭代器后,其他线程删除了该元素时候并不会抛出java.util.ConcurrentModificationException异常,能够保持创建迭代器后的元素一定被正确的next出来。阿里巴巴长期招聘Java研发工程师p6,p7,p8等上不封顶级别,有意向的可原创 2018-01-27 12:13:49 · 909 阅读 · 1 评论 -
并发队列-无界阻塞延迟队列DelayQueue原理探究
一、前言DelayQueue队列中每个元素都有个过期时间,并且队列是个优先级队列,当从队列获取元素时候,只有过期元素才会出队列。阿里巴巴长期招聘Java研发工程师p6,p7,p8等上不封顶级别,有意向的可以发简历给我,注明想去的部门和工作地点:1064454834@qq.com二、 DelayQueue类图结构image.png如原创 2018-01-27 12:14:36 · 859 阅读 · 0 评论 -
Java中线程池ThreadPoolExecutor原理探究
一、 前言线程池主要解决两个问题:一方面当执行大量异步任务时候线程池能够提供较好的性能,,这是因为使用线程池可以使每个任务的调用开销减少(因为线程池线程是可以复用的)。另一方面线程池提供了一种资源限制和管理的手段,比如当执行一系列任务时候对线程的管理,每个ThreadPoolExecutor也保留了一些基本的统计数据,比如当前线程池完成的任务数目。另外,线程池提供许多可调参数和可扩原创 2018-01-27 12:15:18 · 283 阅读 · 0 评论 -
Java中调度线程池ScheduledThreadPoolExecutor原理探究
一、 前言前面讲解过Java中线程池ThreadPoolExecutor原理探究,ThreadPoolExecutor是Executors中一部分功能,下面来介绍另外一部分功能也就是ScheduledThreadPoolExecutor的实现,后者是一个可以在一定延迟时候或者定时进行任务调度的线程池。阿里巴巴长期招聘Java研发工程师p6,p7,p8等上不封顶级别,有意向的可以发简原创 2018-01-27 12:15:54 · 275 阅读 · 0 评论 -
使用ThreadLocal不当可能会导致内存泄露
8.2 使用ThreadLocal不当可能会导致内存泄露基础篇已经讲解了ThreadLocal的原理,本节着重来讲解下使用ThreadLocal会导致内存泄露的原因,并讲解使用ThreadLocal导致内存泄露的案例。8.2.1 为何会出现内存泄露基础篇我们讲到了ThreadLocal只是一个工具类,具体存放变量的是在线程的threadLocals变量里面,threadLo原创 2018-01-15 18:27:58 · 17271 阅读 · 8 评论 -
ThreadLocal原理探究
2.1.11 ThreadLocal多线程访问同一个共享变量特别容易出现并发问题,特别是多个线程需要对一个共享变量进行写入时候,为了保证线程安全,一般需要使用者在访问共享变量的时候进行适当的同步,如下图:image.pngimage.png2.1.11.1 ThreadLocal使用实例本节来看下T原创 2018-01-16 12:40:42 · 294 阅读 · 0 评论 -
并发包中ThreadLocalRandom类原理剖析
2.2、 并发包中ThreadLocalRandom类原理剖析ThreadLocalRandom类是JDK7在JUC包下新增的随机数生成器,它解决了Random类在多线程下多个线程竞争内部唯一的原子性种子变量而导致大量线程自旋重试的不足。本节首先讲解下Random类的实现原理已经它在多线程下使用的局限性,然后引入ThreadLocalRandom类,通过讲解ThreadLocalRan原创 2018-01-16 12:43:28 · 664 阅读 · 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 · 499 阅读 · 0 评论 -
线程不安全的SimpleDateFormat
8.5 SimpleDateFormat是线程不安全的SimpleDateFormat是Java提供的一个格式化和解析日期的工具类,日常开发中应该经常会用到,但是由于它是线程不安全的,多线程公用一个SimpleDateFormat实例对日期进行解析或者格式化会导致程序出错,本节就讨论下它为何是线程不安全的,以及如何避免。问题复现为了复现该问题,编写如下代码: pub原创 2018-01-16 12:45:06 · 218 阅读 · 0 评论 -
线程池使用FutureTask时候需要注意的一点事
8.4 线程池使用FutureTask时候需要注意的一点事线程池使用FutureTask的时候如果拒绝策略设置为了 DiscardPolicy和DiscardOldestPolicy并且在被拒绝的任务的Future对象上调用无参get方法那么调用线程会一直被阻塞。问题复现下面就通过一个简单的例子来复现问题:public class FutureTest {原创 2018-01-16 12:45:57 · 5688 阅读 · 0 评论 -
java中守护线程与用户线程
Java线程分为两类分别为daemon线程(守护线程)和User线程(用户线程),在JVM启动时候会调用main函数,main函数所在的线程是一个用户线程,这个是我们可以看到的线程,其实JVM内部同时还启动了好多守护线程,比如垃圾回收线程。那么守护线程和用户线程有什么区别那?区别之一是当最后一个非守护线程结束时候,JVM会正常退出,而不管当前是否有守护线程,也就是说守护线程是否结束并不影响JVM的原创 2018-01-16 12:48:24 · 873 阅读 · 0 评论 -
JDK8中新增原子性操作类LongAdder
LongAdder简单介绍LongAdder类似于AtomicLong是原子性递增或者递减类,AtomicLong已经通过CAS提供了非阻塞的原子性操作,相比使用阻塞算法的同步器来说性能已经很好了,但是JDK开发组并不满足,因为在非常高的并发请求下AtomicLong的性能不能让他们接受,虽然AtomicLong使用CAS但是CAS失败后还是通过无限循环的自旋锁不断尝试的 pu原创 2018-01-16 12:49:46 · 1572 阅读 · 0 评论 -
JDK8中新增原子性操作类LongAccumulator
一、 LongAccumulator类原理探究LongAdder类是LongAccumulator的一个特例,LongAccumulator提供了比LongAdder更强大的功能,如下构造函数其中accumulatorFunction一个双目运算器接口,根据输入的两个参数返回一个计算值,identity则是LongAccumulator累加器的初始值。 public LongAc原创 2018-01-16 12:50:19 · 1180 阅读 · 0 评论 -
JDK8并发包新增StampedLock锁
4.8 JDK8新增的StampedLock锁探究StampedLock是并发包里面jdk8版本新增的一个锁,该锁提供了三种模式的读写控制,三种模式分别如下:写锁writeLock,是个排它锁或者叫独占锁,同时只有一个线程可以获取该锁,当一个线程获取该锁后,其它请求的线程必须等待,当目前没有线程持有读锁或者写锁的时候才可以获取到该锁,请求该锁成功后会返回一个stamp票据变量用来表原创 2018-01-17 09:40:31 · 359 阅读 · 0 评论 -
子线程优雅调用父线程RequestScope作用域Bean问题的探究
一、前言最近我们组在做项目分层模块化项目调研,就产生一个问题如何在开启的线程中不破坏使用习惯情况下使用请求线程里面的RequestScope作用域的bean,感觉这个问题比较有意思就研究并整理下一下,以便备忘,下面从最基础知识将起,一步步引入问题和解决方法二、ThreadLocal原理众所周知如果一个变量定义为了threadlocal变量,那么访问这个变量的每个线程都独有一个属于自原创 2018-01-14 17:36:36 · 1046 阅读 · 0 评论