配色: 字号:
并发编程概述
2020-12-12 | 阅:  转:  |  分享 
  
并发编程2020-12-09演讲人目录01.02.多线程优势风险04.03.对象共享线程安全性06.05.基础构建模块对象组合07.结构化并
发应用程序01多线程优势多线程优势提升资源利用率和系统吞吐率发挥多处理器的强大能力02风险风险010203活跃性问题,多线程中可能
会出现进程死锁的情况安全性问题,对于非线程安全的程序执行过程可能不可预测性能,多线程会带来性能上的开销03线程安全性线程安全性01
02030405概念:无论运行环境采用何种调度方式或者这些线程将如如何交替执行,在主调代码中不需要任何额外的同步或协同,这个类都能
表现出正确的行为,称为线程安全类核心在于对状态访问操作的管理,特别是共享和可变的状态的访问无状态对象一定是线程安全,即类中没有任何
成员变量,也没有对其他类中成员变量的引用由于不恰当的执行时序而出现不正确的结果,称之为竞态条件加锁机制线程安全性核心在于对状态访问
操作的管理,特别是共享和可变的状态的访问共享表示多个线程同时访问,可变表示变量的值在其声明周期内可以发生变化线程安全性0201最常
见的为''先检查后执行'',check-then-act复合操作,++i等都为复合操作,必须引入必要的同步机制保证线程安全由于不恰当的
执行时序而出现不正确的结果,称之为竞态条件线程安全性加锁机制内置锁,即synchronizedblock,是一种互斥锁;内置锁可
重入,即如果某个线程视图获得一个已经由它自己持有的锁,这个请求就会成功对于可能被多个线程同时访问的可变状态变量,访问它时都需要持有
同一个锁权衡简单性和性能之间的关系,避免出现不良并发与应用04对象共享对象共享0102可见性volatile变量,用来确保变量的更
新操作通知到其他线程0304发布与逸出线程封闭,即不共享数据对象共享可见性当一个线程修改对象状态后其它线程能够看到发生的状态变化可
见性当一个线程修改对象状态后其它线程能够看到发生的状态变化在没有同步的情况下,编译器处理器都可能对操作的执行顺序进行调整,而引发意
想不到的情况对象共享volatile变量,用来确保变量的更新操作通知到其他线程声明为volatile后,编译器不会对该变量上的操作
重新排序,不会缓存在寄存器或者其他处理器看不到的地方1典型用法:检查某个状态标识以判断是否退出循环2volatile变量不能保证操
作的原子性,使用volatile变量要满足三个条件3volatile变量,用来确保变量的更新操作通知到其他线程声明为volatil
e后,编译器不会对该变量上的操作重新排序,不会缓存在寄存器或者其他处理器看不到的地方典型用法:检查某个状态标识以判断是否退出循环
volatile变量不能保证操作的原子性,使用volatile变量要满足三个条件对变量的写入操作不依赖变量的当前值,或者保证只
有单线程更新变量的值该变量不会跟其他状态变量一起纳入不变性条件在访问变量时不需要加锁对象共享发布与逸出发布对象指使对象能够在当前作
用域之外的代码中执行发布与逸出发布对象指使对象能够在当前作用域之外的代码中执行不要隐式的使this引用逸出;不要在构造器中使thi
s引用逸出发布一个对象后,在该对象的非私有域中引用的所有对象都会被发布对象共享线程封闭,即不共享数据0102ad-hoc线程封闭,
线程封闭的职责由程序来承担栈封闭,只有通过局部变量才能访问对象0304ThreadLocal类,用于对可变单实例变量或者全局变量进
行共享不变性ad-hoc线程封闭,线程封闭的职责由程序来承担线程封闭,即不共享数据线程封闭,即不共享数据栈封闭,只有通过局部变量才
能访问对象线程封闭,即不共享数据ThreadLocal类,用于对可变单实例变量或者全局变量进行共享不变性满足下面条件对象才是不可变
的对象创建以后其状态就不能修改对象所有域都是final对象是正确创建的(没有在创建时this引用逸出)05对象组合设计线程安全类下
一个状态依赖于当前状态,这个操作必定会是复合操作收集同步需求基于状态的先验条件,例如不能从空的队列中删除元素依赖状态操作状态所有
权对象组合实例封闭010203将数据封装在对象内部,将数据的访问限制在对象的方法上内置锁,synchronizedjava类库里的
容器线程啊全包装类对象组合线程安全性委托利用线程安全类组合对象当类中有复合操作,仅仅使用委托不足以实现线程安全性,必须提供加锁机制
保证复合操作为原子操作,除非整个复合操作都可以委托给状态变量对象组合在现有线程安全类中添加功能通过组合实现添加功能06基础构建模块
基础构建模块同步容器类并发容器生产者与消费者ABC阻塞方法和中断方法同步工具类DE基础构建模块同步容器类同步容器执行check-t
hen-act操作时,没有客户端加锁也是线程安全的,但当多个线程修改容器时,可能会出现意料之外的情况01迭代器和Concurren
tModificationException02同步容器类同步容器执行check-then-act操作时,没有客户端加锁也是线程安
全的,但当多个线程修改容器时,可能会出现意料之外的情况迭代器和ConcurrentModificationException如果在
迭代期间计数器被修改,执行hasNext和next将抛出ConcurrentModificationException隐藏的迭代器
容器的toString()方法,equals,hashCode等方法都可能抛出ConcurrentModificationExc
eption基础构建模块并发容器通过并发容器代替同步容器可以极大的提高伸缩性并降低风险并发容器通过并发容器代替同步容器可以极大的提
高伸缩性并降低风险例如ConcurrentHashMap,CopyOnWriteArrayList,Queue,BlockingQ
ueue等01双端队列,Deque,BlockingDeque02基础构建模块生产者与消费者成功用阻塞队列支持生产者和消费者模式,
将数据的生产和使用过程解耦来简化工作负担使用双端队列,支持工作秘取,既每个消费者都有一个双端的工作队列,当某个消费者完成自己队列的
全部工作,可以从其他消费者的双端队列末尾秘密的取得工作生产者与消费者用阻塞队列支持生产者和消费者模式,将数据的生产和使用过程解耦来
简化工作负担01使用双端队列,支持工作秘取,既每个消费者都有一个双端的工作队列,当某个消费者完成自己队列的全部工作,可以从其他消费
者的双端队列末尾秘密的取得工作02基础构建模块阻塞方法和中断方法ABThread提供interrupt方法用于中断县城或者查询线程
是否已经被中断当代码调用了一个会抛出interruptedException异常的方法时,该方法自己就变成了一个阻塞方法阻塞方法和
中断方法Thread提供interrupt方法用于中断县城或者查询线程是否已经被中断当代码调用了一个会抛出interruptedE
xception异常的方法时,该方法自己就变成了一个阻塞方法传递异常恢复中断基础构建模块同步工具类闭锁闭锁延迟线程的进度直到其到达终止状态CountDownLatchFutureTaskSemaphore,信号量,用来控制同时访问某个特定资源的操作数量栅栏,CyclicBarrier,所有线程同时到达栅栏位置才能继续执行07结构化并发应用程序结构化并发应用程序感谢聆听
献花(0)
+1
(本文系职场细细品原创)