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