并发编程
2019-09-18 10:35:27 0 举报
AI智能生成
java并发编程
作者其他创作
大纲/内容
内存模型
重排序
顺序一致性
happens-before
要想保证执行操作B的线程看到线程A的结果,
那么A和B之间必须满足Happen-Before规则。
子主题 2
as-if-serial
安全性
特性
原子性
可见性
有序性
线程封闭
ad-hoc线程封闭
程序封闭,程序控制,性能不好,忽略
堆栈封闭
局部变量,无并发问题
ThreadLocal线程封闭
比较好的方式
对象发布与逃逸
对象发布
使一个对象能被当前范围之外的代码所使用。
对象逃逸
一种错误的发布,当一个对象还没构造完,其它线程就能看到
安全的发布对象
在静态初始化函数中初始化一个对象引用
将对象的应用保存在volatile类型/AtomicReference对象中
将对象的引用保存到由final域中
将对象的引用保存到有锁保护的域中
单例模式
饿汉
静态属性直接new
静态代码块
懒汉(双重否定+volatile)
new对象
1、分配对象的内存空间
2、初始化对象
3、设置instance指向刚分配的内存
指令重排(jvm,cpu优化)1、3、2
枚举
JVM保证枚举的构造方法只被调用一次
不可变对象
条件
对象创建后,状态不能改变
对象所有域都是final类型
修饰类:不能被继承
修饰方法:不能被继承类修改、效率
修饰变量:基本不能被修改,引用不能指向新的
对象正确创建(this引用没有逸出)
子主题
锁
死锁
原因
互斥
请求保持等待
不剥夺条件
循环等待
预防死锁
volatitle
可见性、防止指令重排序
语义
内存模型
什么是内存屏障
编译时
运行时,多个cpu交互运行,
引起的内存乱序(volatitle无法解决)
如何防止指令重排
loadload
loadstore
storestore
storeload
synchronized
同步、重量级锁
xynchronnized原理
锁优化
自旋锁
偏向锁
轻量级锁
重量级锁
重入锁
ReentrantLock
ReentrantReadWriteLock
Condition
并发基础
AQS
AbstractQueueSynchronizer同步器
CLH同步队列
同步状态的获取和释放
线程阻塞和唤醒
CAS
CAS
缺陷
原子操作类
基本类型
数组
引用类型
并发集合
ConcurrentHashMap
ConcurrentLinkedQueue
ConcurrentSkipListMap
CopyOnWriteArrayList
并发工具类
CyclicBarrier
CountDownLatch
Semphore
其他
ThreadLocal
Fork
Join
线程池
Executor
ThreadpoolExecutor
Callable
Future
ScheduleExecutorService
关闭线程池
shutdownNow方法,可能会引起报错,要对任务里进行异常捕获.
shutdown方法可能会导致线程关闭不了,不应有永久阻塞等待的逻辑。
shutdownNow和shuwdown调用完,线程池并不是立马就关闭了,
要想等待线程池关闭,还需调用awaitTermination方法来阻塞等待
RejectedException
AbortPolicy:直接抛出RejectedExecutionException异常,阻止系统正常运行
CallerRunsPolicy:该策略既不会抛弃任务,也不会抛出异常,而是将不能执行的任务回退给调用者,从而降低新任务的流量
DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交当前任务
DiscardPolicy:直接丢弃任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种方案
原理
1. 当线程池中的线程数小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
2. 当线程池达到corePoolSize时,新提交任务将被放入 workQueue 中,等待线程池中任务调度执行。
3. 当workQueue已满,且 maximumPoolSize 大于 corePoolSize 时,新提交任务会创建新线程执行任务
4. 当提交任务数超过maxmumPoolSize+workQueue时,新提交任务由 RejectedExecutionHandler 处理
5. 当线程池中线程数超过corePoolSize,空闲时间超过keepAliveTime的线程会被销毁
6. 当设置allowCoreThreadTimeOut(true)时,任何线程空闲时间超过keepAliveTime后就会被销毁。
优化
使用本地变量
使用不可变类
最小化锁的范围
使用线程池
使用同步代替线程的wait和notify
使用BlockingQueue使用消费者生产者模式
使用并发集合而不是锁的同步集合
使用同步代码块而不是同步方法
避免使用静态变量,多常量
优化
使用本地变量
使用不可变类
最小化锁的范围
使用线程池
使用同步代替线程的wait和notify
使用BlockingQueue使用消费者生产者模式
使用并发集合而不是锁的同步集合
使用同步代码块而不是同步方法
避免使用静态变量,多常量
收藏
收藏
0 条评论
下一页