Java并发整理
2022-02-21 本文已影响0人
ZoranLee
Java并发编程.png
CPU
多核心
- CMP【单芯片多处理器】
- 一般情况下一个核心对应一个线程1:1的关系
- Intel引入超线程技术,核心数和线程数是1:2的关系
- 核心数
- 线程数
多线程
让同一个处理器上的多个线程同步执行共享处理器的执行资源
时间片轮转机制
- RR调度
- 每个进程被分配一个时间段,称作它的时间片
- 通常时间片设为100ms
进程
特点
1、进程是程序运行【资源】分配的最小单位资源
CPU
内存空间
磁盘IO
其他
2、进程是系统进行资源分配和调度的一个独立单位
3、进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动
4、同一进程中多条线程共享该进程中的全部系统资源
5、进程和进程之间是相互独立
并行
一组程序按独立异步的速度执行,无论从微观还是宏观,程序都是一起执行的
并发
线程
-
简介
1、一个程序里不同的执行路径【非官方解释】 2、CPU调度的最小单位,必须依赖进程而存在 3、与同属进程的其他线程共享进程所有的全部资源
-
synchronize(Object)
1、Object不能用String、常量、Integer、Long 2、锁的是对象、不是代码
-
锁升级
1、偏向锁 记录线程id【与新来线程id比较】 相等 直接执行 不相等 锁升级【自旋锁】while(tryLock) 自旋次数大于10,未拿到锁 锁升级 【重量级锁】 进入OS【等待队列】,不占CPU时间 自选次数小于10,拿到锁 2、自旋锁 线程数少的时候使用自旋锁【自旋占CPU时间】 3、重量级锁 线程数多用重量级锁 操作消耗时间长
锁优化
-
锁粗化
-
减少锁持有时间
-
减小锁粒度
大对象拆成小对象 ConcurrentHashMap
-
锁分离
ReadWriteLock【LinkedBlockingQueue】 读读不互斥 读写互斥 写写互斥
-
Lock【一个接口】
1、实现方式是CAS,占用cup时间 2、提供了比synchronized更多的功能 a、尝试非阻塞地获取锁 b、能被中断地获取锁 c、超时获取锁 https://cloud.tencent.com/developer/article/1151531 3、必须要用户去手动释放锁 如果没有主动释放锁,就有可能导致出现死锁现象。 4、实现类:ReentrantLock
volatile【可变的,需要跟踪】
1、保证线程之间可见性
变量,线程之间不可见
2、禁止指令重排序
指令重排序[cpu]
现状:compiler重新排顺序,提高运行效率【汇编】
DCL单例
MESI协议
CPU缓存一致性协议【硬件】
多个CPU可见
CAS
1、步骤
a、读取旧值为一个临时变量
b、对旧值的临时变量进行操作或者依赖旧值临时变量进行一些操作
c、判断旧值临时变量是不是等于旧值,等于则没被修改,那么新值写入.不等于则被修改,此时放弃或者从步骤1重试
2、无锁优化 自旋
3、ABA问题
AtomicStampedReference解决ABA问题,加版本号
4、AtomicXXX
AtomicInteger
5、ReentrantLock
Lock lock = new ReentrantLock();
try{
lock.lock();//加锁操作
}finally{
lock.unlock();
}
Unsafe类【C、C++指针】
getUnsafe 单例
直接操作内存
直接生产类实例
CAS相关操作