高并发

高性能高并发队列-Disruptor

依然范特西╮ 提交于 2019-11-30 10:59:00
Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖。 Java内置队列 介绍Disruptor之前,我们先来看一看常用的线程安全的内置队列有什么问题。Java的内置队列如下表所示。 队列 有界性 锁 数据结构 ArrayBlockingQueue bounded 加锁 arraylist LinkedBlockingQueue optionally-bounded 加锁 linkedlist ConcurrentLinkedQueue unbounded 无锁 linkedlist LinkedTransferQueue unbounded 无锁 linkedlist PriorityBlockingQueue unbounded 加锁 heap DelayQueue unbounded 加锁 heap 队列的底层一般分成三种:数组、链表和堆。其中,堆一般情况下是为了实现带有优先级特性的队列,暂且不考虑。 我们就从数组和链表两种数据结构来看

Java解决多人同时操作的解决方案 实际例子介绍

北慕城南 提交于 2019-11-29 13:15:43
简介 最近公司在做团购这块的一个商品的促销活动,在创建促销的时候发现只能有一个用户进行修改和编辑,如果其他用户操作同一个促销活动就会出现数据不一致,这也就是我们经常遇到的多人同时操作的问题,下面我将详细介绍关于这块我们的解决方案 出现数据不一致的现象通常分为两种:1.覆盖更新 2.脏读 关于这类问题一般会考虑到用数据库锁的机制来解决 数据库锁分为乐观锁和悲观锁 乐观锁 乐观锁并不锁住任何东西,而是在提交事务时检查自己上次读取这条记录后,是否有其他事务修改了这条记录,如果没有则提交,如果被修改了则回滚。如果并发的可能性并不大,那么锁定策略带来的性能消耗是非常小的 悲观锁 与乐观锁相比,悲观锁则是一把真正的锁了,它通过SQL语句“select for update”锁住数据,这时如果其他事务来更新时会等待,悲观锁会锁住整张表,性能较低,导致其他的事务不能访问 实例介绍 接下来对于这块我采用的是乐观锁的方案,关于实现乐观锁有三种方式: 1.是为数据表增加一个version字段,每次事务开始时,取出version,在提交事务时,检查version是否有变化 如果没有变化提交事务时将version + 1,SQL差不多是这样: UPDATE t_promotion set version = version + 1 where promotionid = ? and version = ?

Netty那点事(四)Netty与Reactor模式

风流意气都作罢 提交于 2019-11-29 00:15:19
一:Netty、NIO、多线程? 时隔很久终于又更新了!之前一直迟迟未动也是因为积累不够,后面比较难下手。过年期间 @李林锋hw 发布了一个Netty5.0架构剖析和源码解读 http://vdisk.weibo.com/s/C9LV9iVqH13rW/1391437855 ,看完也是收获不少。前面的文章我们分析了Netty的结构,这次咱们来分析最错综复杂的一部分-Netty中的多线程以及NIO的应用。 理清NIO与Netty的关系之前,我们必须先要来看看Reactor模式。Netty是一个典型的多线程的Reactor模式的使用,理解了这部分,在宏观上理解Netty的NIO及多线程部分就不会有什么困难了。 本篇文章依然针对Netty 3.7,不过因为也看过一点Netty 5的源码,所以会有一点介绍。 二:Reactor,反应堆还是核电站? 1、Reactor的由来 Reactor是一种广泛应用在服务器端开发的设计模式。Reactor中文大多译为“反应堆”,我当初接触这个概念的时候,就感觉很厉害,是不是它的原理就跟“核反应”差不多?后来才知道其实没有什么关系,从Reactor的兄弟“Proactor”(多译为前摄器)就能看得出来,这两个词的中文翻译其实都不是太好,不够形象。实际上,Reactor模式又有别名“Dispatcher”或者“Notifier”