高并发总结
Posted test1234
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高并发总结相关的知识,希望对你有一定的参考价值。
高并发
解决思路和手段
- 扩容 水平扩容,垂直扩容
- 缓存 Redis,Memcache,Guava,Cache的介绍和使用
- 队列 kafka,RabbitMQ,RocketMQ等队列特征介绍及使用队列的关注点
- 应用拆分 服务化Dubbo与微服务Spring Cloud介绍
- 限流 Guava RateLimiter的介绍与使用,常用限流算法,自己实现的分布式限流
- 服务降级和熔断 服务降级的多种选择,hystrix介绍及使用
- 数据库和切库,分库,分表 介绍数据库和切库,分库,分表支持多数据源的原理及实现
高可用的一些手段 任务调度分布式elastic-job,主备curator的实现,监控报警机制
并发及并发的线程安全处理
线程安全性 表现为原子性,可见性,有序性,atomic包,cas算法,synchorized与lock,volatile,happes-before
安全性 表现为正确的行为
原子性
Atomic 只能更新一个值
- CAS AtomicInteger使用一个unsafe的类的getAndAddInt()的方法,此方法使用CAS锁进行参数的操作compareAndSwap
- AtomicLong 精确,jdk8新增了一个LongAdder
- LongAdder 将单点的高并发压力分散到各个点上
AtomicReference
private static AtomicReference
count = new AtomicReference<>(0);
atomicReference.compareAndSet(0, 2)是0的话更新为2否则不执行,更新的字段AtomicReferenceFieldUpdater
private static AtomicIntegerFieldUpdater
updater =
AtomicIntegerFieldUpdater.newUpdater(AtomicExample5.class, "count");
@Getter
public volatile int count = 100;//更新类的某个实例的中的volatile字段
atomicReference.compareAndSet(example5, 100, 120)- AtomicStampReferece 解决CAS的ABA问题 加版本号
- AtomicLongArray 数组 更新索引的值
AtomicBoolean 适合在高并发的情况下代码只可能执行一次
Synchronized 不可中断
- 修饰代码块
- 修饰方法(交替执行)
- 修饰静态方法 作用于所有对象(依次执行)
修饰类
Lock 可中断
ReentrantLock
可见性
- 线程交叉执行
- 重排序结合线程交叉执行
共享变量更新后的值没有在工作内存与主存间及时更新
有序性
安全发布对象 安全发布方法,不可变对象,final关键字使用,不可变方法,线程不安全类与写法
线程安全手段 堆栈封闭,ThreadLocal线程封闭,JDBC的线程封闭,同步容器,并发容器,J.U.C
AQS等J.U.C组件 CountDownLatch,Semaphore,CyclicBarrier,ReentrantLock与锁,Condition,FutureTask,Fork/Join框架,BlockingQueue
线程池 newThread的弊端,线程池的好处,ThreadPoolExecutor,Execcutor框架接口
额外补充 死锁的产生和与预防,多线程并发最佳实践,spring的线程安全,hashmap和concurrentHashMap深入讲解
基础知识讲解与核心知识准备
并发,高并发相关概念
cpu多级缓存 缓存一致性 乱序执行优化
cpu多级缓存
- cpu cache的出现原因 缓解cpu与硬盘速度不匹配的问题
cpu cache的意义 时间局部性,空间局部性
缓存一致性 MESI
- M(被修改)E(独享)S(共享)I(无效)保证多个CUP cache的之间缓存共享数据一致
local read,local write,remote read,remote write
乱序执行优化
处理器为提高运算速度而做出的违背代码原有的顺序的优化
java内存模型 JMM规定,抽象结构同步操作与规则
java内存模型(JMM)
- stack 两个栈 垃圾回收 方法区的本地变量 快 动态分配 保存对象
heap 堆 静态变量 基本数据类型 引用对象 共享
同步的八种操作
- lock锁定
- unlock解锁
- read读取
- load载入
- use使用
- assign赋值
- store存储
write写入
并发优势与风险
风险
- 安全性 多线程操作数据不一致
- 活跃性 某个操作无法继续进行下去时就会发生活跃性问题,如死锁,饥饿
性能 线程过多使用导致cpu频繁切换,调度时间增多,同步机制,消耗过多内存
优势
- 速度 同时处理多个请求,响应更快,复杂的操作可以分为多个进程同时进行
- 设计 程序设计在某些情况下更简单,也可以有更多的选择
资源利用 cpu能够在等待IO的时候做其他的事情
并发模拟 Postman,JMeter,Apache Bench,代码
Postman
- 下载即可
- 点击左边侧边框collectios,创建一个collections
- 将测试地址添加到这个集合中(点击右边的save)
- 点击集合右击箭头,点击run
配置参数Iterations 次数 iterations 延迟时间
Apache Bench
- 安装
- 更改httpd.conf文件中的所有路径改为放置路径
配置ServerName=127.0.0.1
命令.\ab -n 1000 -c 50 http://127.0.0.1:8080/test 1000个请求,并发50个
返回结果的具体解析
- Concurrency level 并发量
- Time taken for tests 测试所用的时间
- complete requests 完成请求的数量
- failed requests 失败的请求数量
- total transferred 所有请求的响应数据长度总和,包括http
- html transferred 所有请求中正文的数据总和,是上面减去http的结果
- requests per second 吞吐率 和并发数相关,是complete requests/Time taken for tests
- time per request 用户平均等待时间
- time per request 服务器平均时间
transfer rate 请求单位时间从服务器获取数据长度 是total transferred/Time taken for tests
JMeter
- 下载运行jmeter.bat即可
右击左边侧边栏的test plan 依次点击add threads treadown-thread-group
具体参数
- name 测试名
- number of threads 虚拟用户的数量
- ramp-up period 虚拟用户增长时长,设置多少秒完成操作
- loop count 循环次数 用户发送多少次请求
- 配置http请求 右击 add sampler http-request 进行配置
- 配置监听器 右击 add listener graph-result(图形结果)和view results tree(查看结果树)
配置log 点击 options 点击log view
代码
- CountDownLatch 控制线程执行后进行输出
Semaphore 控制线程的执行
以上是关于高并发总结的主要内容,如果未能解决你的问题,请参考以下文章