java并发编程
2021-08-29 14:18:34 22 举报
AI智能生成
并发编程的知识图谱
作者其他创作
大纲/内容
并发工具类
CountDownLatch
线程计数
内部类Sync实现AQS同步器
CyclicBarrier
计数器可以reset
getNumberWaiting
isBroken是否被中断
基于ReentrantLock+Condition
Semaphore
Exchanger
CAS
compare and swap
基于冲突检测的乐观锁
操作数
内存位置
预期原值
新值
线程自旋
带来的问题
ABA
AtomicStampedReference解决
代码块原子性
CPU利用率
atomic
AtomicInterger
volatile+CAS 来保证原子操作
AtomicBoolean
AtomicLong
Future
Future获取异步任务的结果
ThreadLocal
本地线程副本变量工具类
各个线程互不干扰
高并发场景下实现无状态调用
空间换时间概念
要素
原子性
原要么全部执行,要么就全部都不执行
可见性
可见性指多个线程操作一个共享变量时,线程可以立即看到修改的结果
有序性
有序性,即程序的执行顺序按照代码的先后顺序来执行
锁
synchronized
控制线程同步
一段代码、方法、变量加锁
关键字
加锁操作的对象头中的markword
悲观锁,抢占式,引起其他线程阻塞
Lock
ReenTrantLock
可以获取锁的等待时间,避免死锁
获取各种锁的信息
灵活实现多路通知
底层调用Unsafe的park方法加锁
优点
实现公平锁
等待锁的时候响应中断
可以尝试获取锁
不同范围、不同顺序获取和释放锁
乐观锁
并发操作线程乐观,比较和替换操作放在修改内存变量中
悲观锁
操作资源时候持有独占锁
为什么要使用多线程
多核CPU
防止阻塞
建模、任务拆解
创建线程
实现方式
实现Runbale接口
重写方法是run
实现Callable接口
重写方法是call,可以抛出异常
Future对象获取异步计算结果
继承Thread类
状态
新建
就绪
start方法后,进入就绪状态
运行
调度到线程开始运行
阻塞
等待阻塞,wait
同步阻塞,synchronized 同步锁获取失败
sleep,join等阻塞
死亡
线程池
newCacheThreadPool:可缓存线程池
newFixedThreadPool:定长线程池,控制线程最大并发数量
newScheduledThreadPool:定长线程池,支持定时执行任务
newSingleThreadExecutor:单例线程池
线程池的优点
重复使用,减少开销
有效控制并发,提高使用率
提供定时执行、定期执行、单线程、并发控制
AQS:AbstractQueuedSynchronizer
独占式
ReentrantLock
共享式
Semaphore
CountDownLatch
组合
ReentrantReadWriteLock
读写分离,读是共享,写是独占
并发集合
Vertor
ConcurrentHashMap
散列链表+红黑树
利用volatile+CAS实现
内部类TreeBin
ConcurrentSkipListMap
跳表,按照key自然排序
利用volatile+CAS实现
CopyOnWriteArrayList
数组
利用写时复制实现线程安全
volatile+ReentrantLock
ConCurrentLinkedQueue
链表
利用volatile+CAS
0 条评论
下一页