并发课程总结
2023-12-21 12:26:09 0 举报
AI智能生成
java并发课程总结思维导图
作者其他创作
大纲/内容
进程
线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位
New
Runnable
Running
Blocked
状态
线程
进程和线程
是指同一时刻内,有多个任务同时进行
并行
是指一段时间内,多个任务交替执行,采用时间片轮法
并发
并发与并行
volatile关键字是用来保证内存可见性的问题,可以用来解决指令重排序
每个线程都有自己的线程副本,操作共享变量时,实际上是操作自己副本里的数据 ,但是多线程环境下,对共享变量操作,会产生线程安全的问题,加了volatile关键字可以时线程在读写副本变量时,可以立即刷回到主内存,并通知其它线程,该缓存行失效,需要从主内存重新加载
可见性
在多线程环境下,jvm虚拟机对程序指令进行重新排序的一种优化手段,也就是说程序执行的顺序和我们所想的顺序不一致,为了解决这种问题,引入了volatile关键字
有序性
volatile只能保证有序性,无法保证原子性,像i++这种操作就不是原子的
原子性
并发的三大特性
分配内存空间
初始化对象
将初始化好的对象指向内存空间的地址
对象创建
volatile
如果一个信息项正在被访问,那么在近期它可能还会被再次访问,比如循环、递归、方法的反复调用等
时间局部性(Temporal Locality)
如果一个存储器的位置被引用,那么它附近的位置也可能被引用,比如顺序执行的代码,连续创建两个对象,数组等
空间局部性
CPU高速缓存
多CPU多核缓存架构
MESI缓存一致性协议
类型指针,JVM通过对象的类型指针来判断对象的实例是哪一个,对象占两个机器码,数组占三个
Klass Pointer
hashcode
gc分代年龄
是否偏向
锁状态
Mark Word
对象头
可重入
由JVM自己实现
使用简单,无需关心加解锁逻辑
锁粒度粗
特性
轻量级锁(00)
重量级锁(10)
自旋锁
适应性自旋锁
锁粗化
锁消除
锁优化
synchronized
计数器,常用于同步等待一批线程
CountDownLatch
信号量,常用于限流
Semaphore
栅栏(环形屏障),作用和CountDownLatch类似,可重复使用
CyclicBarrier
同步器
Callable
Future
FutureTask
CompletionService
CompletableFuture
并发工具类
同步等待队列
条件等待队列
阻塞等待队列
共享/独占
公平/非公平
锁粒度更细
允许中断
共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源
tryAcquireShared(int)
共享方式。尝试释放资源,如果释放后允许唤醒后续等待结点返回true,否则返回false
tryReleaseShared(int)
共享锁
该线程是否正在独占资源。只有用到condition才需要去实现它
isHeldExclusively()
独占方式。尝试获取资源,成功则返回true,失败则返回false
tryAcquire(int)
独占方式。尝试释放资源,成功则返回true,失败则返回false
tryRelease(int)
独占锁
资源共享方式
park()
parkNanos(long nanos)
unPark(Thread t)
LockSupport
ASQ
ReentrantReadWriteLock.ReadLock
ReentrantReadWriteLock.WriteLock
读写锁
lock
tryLock
lockInterruptibly
unlock
newCondition
常用方法
ReentrantLock
set
get
getAndIncrement
IncrementAndGet
getAndDecrement
decrementAndGet
AtomicInteger
AtomicLong
AtomicBoolean
AtomicReference
原子操作类
int takIndex
int putIndex
Object []items
ReentrantLock lock
Conditaion notEmpty
Conditaion notFull
有界阻塞队列
ArrayBlockingQueue
无界阻塞队列
LinkedBlockingQueue
优先级队列
PriorityQueue
延迟队列
DelayQueue
分类
往队列中放入元素,成功返回true,失败抛异常
add
往队列中放入元素,入队成功返回true,失败返回false
offer
往队列中放入元素(队满会阻塞)
put
从队列中获取元素(队空会阻塞,会释放cpu资源)
take
从队列中获取元素(队空会阻塞线程,不会释cpu资源)
poll
从队列中获取元素,队空返回null
peek
操作
阻塞队列
offset
UnsafeFactory.getUnsafe
compareAndSwapInt
compareAndSwapLong
compareAndSwapObject
Unsafe
基于ReentrantLock实现分段锁
JDK1.7
基于分段锁+CAS保证线程安全,分段锁基于synchronized关键字实现
JDK1.8
int DEFAULT_CAPACITY = 16
float LOAD_FACTOR = 0.75f
TREEIFY_THRESHOLD = 8
int UNTREEIFY_THRESHOLD = 6
结构
扩容机制
如何解决Hash冲突
ConCurrentHashMap
corePoolSize-核心线程数
maximumPoolSize-最大线程数
keepAliveTime-线程空闲时间
TimeUnit-时间单位
workQueue-工作队列
ThreadFactory-线程工厂
RejectedExecutionHandler-拒绝策略
ThreadPoolExecutor
ScheduledThreadPoolExecutor
定长线程池
newFixedThreadPoolExecutor
可缓存的线程池
newCachedThreadPoolExecutor
可执行周期性任务的线程池
newScheduledThreadPoolExecutor
只有一个线程的线程池
newSingleThreadPoolExecutor
Executors
直接抛出异常,默认策略
AbortPolicy
直接丢弃任务
DiscardPolicy
丢弃阻塞队列中靠最前的任务,并执行当前任务
DiscardOldestPolicy
用调用者所在的线程来执行任务
CallerRunsPolicy
实现RejectedExecutionHandler接口
自定义策略
拒绝策略
线程池
线程本地局部变量,底层是通过内部类ThreadLocalMap来存放数据的,ThreadLocal作为key,数据作为value
特性
由于ThreadLocal是线程本地变量,在线程结束时,需要显示调用remove方法,否则不会释放内存空间,从而导致内存泄漏
缺点
用于父子线程之间的数据传递
InheritableThreadLocal
解决线程复用时,父子线程之间变量传递
TransmittableThreadLocal
ThreadLocal
对于这样的语句Load1; LoadLoad; Load2, 在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕
LoadLoad屏障
对于这样的语句Store1; StoreStore; Store2, 在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见
StoreStore屏障
对于这样的语句Load1; LoadStore; Store2, 在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕
LoadStore屏障
对于这样的语句Store1; StoreLoad; Load2, 在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见
StoreLoad屏障
内存屏障
Java并发课程总结
收藏
0 条评论
回复 删除
下一页