Disruptor框架
摘要:知识点1:什么是Disruptor Disruptor使用观察者模式, 主动将消息发送给消费者, 而不是等消费者从队列中取; 在无锁的情况下, 实现queue(环形, RingBuffer)的并发操作, 性能远高于BlockingQueue 知识点2:Disruptor的设计方案 Disruptor
阅读全文
高并发下接口幂等性解决方案
摘要:一、背景 我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。 例如1. 前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果;2. 我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也应该只扣一次钱;3. 发送消息,也应该只发一次
阅读全文
ScheduledExecutorService 定时任务运行原理(三)
摘要:Executor JUC 包中的 Executor 架构带来了线程的创建与执行的分离。Executor 的继承者 ExecutorService 下面衍生出了两个重要的实现类,他们分别是 ThreadPoolExecutor 线程池 ScheduledThreadPoolExecutor 支持周期性
阅读全文
ThreadPoolExecutor详解(二)
摘要:在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了资源的开销。而线程池不允许使用Executors去创建,而要通过ThreadPoolExecut
阅读全文
Future模式详细讲解及实例分析
摘要:1.1、Future模式是什么 先简单举个例子介绍,当我们平时写一个函数,函数里的语句一行行同步执行,如果某一行执行很慢,程序就必须等待,直到执行结束才返回结果;但有时我们可能并不急着需要其中某行的执行结果,想让被调用者立即返回。比如小明在某网站上成功创建了一个账号,创建完账号后会有邮件通知,如果在
阅读全文
Executor线程池原理详解(一)
摘要:线程池 线程池的目的就是减少多线程创建的开销,减少资源的消耗,让系统更加的稳定。在web开发中,服务器会为了一个请求分配一个线程来处理,如果每次请求都创建一个线程,请求结束就销毁这个线程。那么在高并发的情况下,就会有大量线程创建和销毁,这就会降低系统的效率。线程池的诞生就是为了让线程得到重复使用,减
阅读全文
ArrayList、LinkedList、CopyOnWriteArrayList源码分析记录
摘要:ArrayList 底层是基于动态数组来进行的 1、List 的长度size 是根据增删元素来进行自增自减的 2、ArrayList在新增元素时,先判断数组的长度是否足够,若足够则把新元素添加至数组中,若不够则进行扩容(也就是数组的复制),扩容完成后把新增的元素添加到新数组中即可完成数据的新增操作;
阅读全文
阻塞队列BlockingQueue之LinkedBlokingQueue
摘要:1、简介 LinkedBlokingQueue 是链表实现的有界阻塞队列,此队列的默认和最大长度为 Integer.MAX_VALUE。此队列按照先进先出的原则对元素进行排序。ArrayList和ArrayBlockingQueue一样,内部基于数组来存放元素,而LinkedBlockingQueu
阅读全文
阻塞队列BlockingQueue之ASynchronousQueue
摘要:一、SynchronousQueue简介 Java 6的并发编程包中的SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除操作take,反过来也一样。 不像ArrayBlockingQueue或LinkedListBloc
阅读全文
阻塞队列BlockingQueue之ArrayBlockingQueue
摘要:ArrayBlockingQueue 是数组实现的有界阻塞队列,此队列按照先进先出(FIFO)的原则对元素进行排序。 构造方法: public ArrayBlockingQueue(int capacity) { this(capacity, false); } public ArrayBlocki
阅读全文
阻塞队列BlockingQueue
摘要:阻塞队列BlockingQueue是一个接口,基于ReentrantLock ,依据它的基本原理,我们可以实现Web中二段长连接聊天功能,当然其最常用的还是用于实现生产者和消费者模式: BlockingQueue接口提供了以下方法: package java.util.concurrent; imp
阅读全文
并发之ATOMIC原子操作--Unsafe解析(三)
摘要:Atomic 类的原子操作是依赖java中的魔法类sun.misc.Unsafe来实现的,而这个类为我们提供了访问底层的机制,这种机制仅供java核心类库使用,而不应该被普通用户使用。 获取Unsafe的实例 查看Unsafe的源码我们会发现它提供了一个getUnsafe()的静态方法。 @Call
阅读全文
并发之ATOMIC原子操作--CAS乐观锁原理(二)
摘要:1.乐观锁介绍 程序完成并发操作时,访问数据时每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止。就是当去做某个修改或其他操作的时候它认为不会有其他线程来做同样的操作(竞争),这是一种乐观的态度,通常是基于CAS 原子指令来实现的。 2.CAS介绍 当多个线程尝试使用CAS
阅读全文
并发之atomic原子操作(一)
摘要:Atomic类 Atomic类是一个简单的高效的、线程安全的递增递减方案,在多线程或者并发环境中,我们常常会遇到这种情况 int i=0; i++ 稍有经验的同学都知道这种写法是线程不安全的。为了达到线程安全的目的,我们通常会用synchronized来修饰对应的代码块。现在我们有了新的方法,就是使
阅读全文
并发编程之CyclicBarrier
摘要:栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。 CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所
阅读全文
并发编程Semaphore详解
摘要:Semaphore的作用:限制线程并发的数量 位于 java.util.concurrent 下, 构造方法 // 构造函数 代表同一时间,最多允许permits执行acquire() 和release() 之间的代码。 public Semaphore(int permits) { sync =
阅读全文
并发之CountDownLatch用法详解
摘要:概念 CountDownLatch 是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后执行。 CountDownlatch 原理 通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成
阅读全文
AbstractQueuedSynchronizer(AQS) 超详细原理解析
摘要:java.util.concurrent包中很多类都依赖于这个类AbstractQueuedSynchronizer所提供的队列式的同步器,比如说常用的ReentranLock,Semaphore和CountDownLatch等. 为了方便理解,我们以一段使用ReentranLock的代码为例,讲解
阅读全文
synchronized(三) 锁的膨胀过程(锁的升级过程)深入剖析
摘要:锁为何存在: 因为在并发情况为了保证线程的安全性,是在一个多线程环境下正确性的概念,也就是保证多线程环境下共享的、可修改的状态的正确性(这里的状态指的是程序里的数据),在java程序中我们可以使用synchronized关键字来对程序进行加锁。 当声明synchronized代码块的时候,编译成的字
阅读全文
synchronized锁机制的实现原理
摘要:Synchronized 锁机制的实现原理 Synchronized是Java种用于进行同步的关键字,synchronized的底层使用的是锁机制实现的同步。在Java中的每一个对象都可以作为锁。 Java中synchronized的两个特性: 互斥性:即在同一时间内只允许同一个县城持有某一个对象锁
阅读全文