java-fly
介绍
线程安全,线程封闭,线程调度,同步容器,并发容器,AQS, J.U.C
高并发解决方案与手段
扩容,缓存,队列,拆分
服务降级与熔断,数据库切库,
并发:多个线程操作相同资源,保证线程安全,合理使用资源
高并发:服务能同时处理很多请求,提高程序性能
工具
postman
apache bench (ab):apache附带的工具,测试网站性能
jmeter:apache组织开发的压力测试工具
代码:semaphore,countdownlatch等
线程安全性
原子性:提供了互斥访问,同一时刻只能有一个线程来对它进行操作
可见性:一个线程对主内存的修改可以及时的被其他线程观察到
有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序的存在,该观察结果一般杂乱无序
可见性:导致共享变量在线程间不可见的原因
线程交叉执行
重排序结合线程交叉执行
共享变量更新后的值没有在工作内存与主内存间及时更新
sychronized:jvm对它的规定
线程解锁前,必须把共享变量的最新值刷新到主内存
线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值(注意:加锁与解锁是用一把锁)
volatile:通过加入内存屏障和禁止重排序优化来实现
对volatile变量写操作是,会在写操作后加入一条store屏障指令,将本地内存中的共享变量值刷新到主内存
对volatile变量读操作是,会在读操作前加入一条load屏障指令,从主内存中读取共享变量
volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作
适用于状态check
线程池的好处
重用存在的线程,减少对象创建,消亡的开销,性能佳
可有效控制最大并发线程数,提高系统资源利用率,同时可以避免过多资源竞争,避免阻塞
提供定时执行,定期执行,单线程,并发数控制等功能
线程池-threadPoolExecutor
corePoolSize:核心线程数量
maximumPoolSize:线程最大线程数
workQueue:阻塞队列,存储等待执行的任务
当线程数小于corePoolSize就会创建新的线程
当大于corePoolSize小于maximumPoolSize
只有当workQueue满的时候,才会创建新的线程
线程池合理配置
cpu密集 cpu+1
Io密集 2*cpu
ReentrantLock(可重入锁)和synchronized 区别
可重入性
锁的实现
性能的区别:之前synchronized性能比ReentrantLock差很多,但是引入偏向锁和轻量级锁(自寻锁)
功能区别
ReentrantLock独有的功能
可指定是公平锁还是非公平锁:所谓公平锁是指的先来的先得到锁
提供了一个condition类,可以分组唤醒需要唤醒的线程
提供能够中断等待锁的线程的机制,lock.lockInterruptibly();
是一种自旋锁,通过循环调用 cas来实现加锁
Synchronized是非公平锁
死锁
互斥条件
请求和保持条件
不剥夺条件
环路等待条件