随笔分类 -  并发&多线程

摘要:一、什么是内存模型,为什么要使用它 如果缺少同步,那么将会有许多因素使得线程无法立即甚至永远看到一个线程的操作结果 编译器把变量保存在本地寄存器而不是内存中 编译器中生成的指令顺序,可以与源代码中的顺序不同 处理器采用乱序或并行的方式来执行指令 保存在处理器本地缓存中的值,对于其他处理器是不可见 在 阅读全文
posted @ 2016-11-11 14:57 HectorHou 阅读(388) 评论(0) 推荐(0) 编辑
摘要:非阻塞算法:使用底层的原子机器指令(例如比较并交换指令)代替锁来确保数据在并发访问中的一致性 应用于在操作系统和JVM中实现线程 / 进程调度机制、垃圾回收机制以及锁和其他并发数据结构 可伸缩性和活跃性上拥有巨大的优势,不存在死锁 原子变量:提供了与volatile类型变量相同的内存语义,并支持原子 阅读全文
posted @ 2016-11-10 22:09 HectorHou 阅读(583) 评论(0) 推荐(0) 编辑
摘要:一、状态依赖性管理 对于单线程程序,某个条件为假,那么这个条件将永远无法成真 在并发程序中,基于状态的条件可能会由于其他线程的操作而改变 1 acquire lock on object state 2 while (precondition does not hold) 3 { 4 release 阅读全文
posted @ 2016-11-10 12:20 HectorHou 阅读(576) 评论(0) 推荐(0) 编辑
摘要:一、Lock与ReentrantLock Lock接口中定义了一种无条件、可轮询的、定时的以及可中断的锁获取操作,所有加锁和解锁的方法都是显式的。 ReentrantLock实现了Lock接口,并提供了与synchronized相同的互斥性和内存可见性。ReentrantLock同样提供了可重入的加 阅读全文
posted @ 2016-11-10 10:53 HectorHou 阅读(1249) 评论(1) 推荐(0) 编辑
摘要:并发程序中潜在错误的发生并不具有确定性,而是随机的。 安全性测试:通常会采用测试不变性条件的形式,即判断某个类的行为是否与其规范保持一致 活跃性测试:进展测试和无进展测试两方面,这些都是很难量化的(性能:即吞吐量,响应性,可伸缩性测试) 一、正确性测试 重点:找出需要检查的不变性条件和后验条件 1、 阅读全文
posted @ 2016-11-08 12:25 HectorHou 阅读(4414) 评论(0) 推荐(0) 编辑
摘要:线程的最主要目的是提高程序的运行性能,但性能的提升会导致复杂性的提升,又会导致安全性和活跃性的风险 一、对性能的思考 提升性能意味着用更少的资源做更多地事情。要想通过并发来获得更好的性能,就要更有效地利用现有处理资源 线程使用的额外的性能开销:线程之间的协调(例如加锁、触发信号以及内存同步等),增加 阅读全文
posted @ 2016-11-07 22:03 HectorHou 阅读(1028) 评论(0) 推荐(0) 编辑
摘要:在安全性和活跃性之间通常存在着某种制衡 一、死锁 定义:在线程A持有锁L并想获得锁M的同时,线程B持有锁M并尝试获得锁L,线程AB均不会释放自己的锁,那么这两个线程将永远地等待下去 在数据库系统的设中考虑了检测死锁以及从死锁中恢复。JVM没有办法解决死锁,只能在编程和测试时注意不要让死锁发生 1、锁 阅读全文
posted @ 2016-11-07 19:29 HectorHou 阅读(820) 评论(0) 推荐(1) 编辑
摘要:一、在任务和执行策略之间隐性耦合 Executor框架将任务的提交和它的执行策略解耦开来。虽然Executor框架为制定和修改执行策略提供了相当大的灵活性,但并非所有的任务都能适用所有的执行策略。 依赖性任务:依赖其他同步任务的结果,使其不得不顺序执行,影响活跃性 使用线程封闭的任务:在单线程的Ex 阅读全文
posted @ 2016-11-07 11:05 HectorHou 阅读(1853) 评论(0) 推荐(0) 编辑
摘要:Java没有提供任何机制来安全地终止线程(虽然Thread.stop和suspend方法提供了这样的机制,但由于存在缺陷,因此应该避免使用 中断:一种协作机制,能够使一个线程终止另一个线程的当前工作 立即停止会使共享的数据结构处于不一致的状态,需要停止时,发出中断请求,被要求中断的线程处理完他当前的 阅读全文
posted @ 2016-11-05 22:30 HectorHou 阅读(1187) 评论(1) 推荐(0) 编辑
摘要:任务:通常是一些抽象的且离散的工作单元。大多数并发应用程序都是围绕"任务执行"来构造的,把程序的工作分给多个任务,可以简化程序的组织结构便于维护 一、在线程中执行任务 任务的独立性:任务并不依赖于其他任务的状态,结果和边缘效应。独立的任务可以实现并行执行 1、串行的执行任务 所有的任务放在单个线程中 阅读全文
posted @ 2016-10-30 20:06 HectorHou 阅读(1442) 评论(0) 推荐(0) 编辑
摘要:委托是创建线程安全类的一个最有效的策略:只需让现有的线程安全类管理所有的状态即可。 一、同步容器类 1、同步容器类的问题 同步容器类都是线程安全的,容器本身内置的复合操作能够保证原子性,但是当在其上进行客户端复合操作则需要额外加锁保护其安全性 由于同步容器类要遵守同步策略,即支持客户端加锁,但必须清 阅读全文
posted @ 2016-10-23 19:55 HectorHou 阅读(599) 评论(0) 推荐(0) 编辑
摘要:一、设计线程安全的类 找出构造对象状态的所有变量(若变量为引用类型,还包括引用对象中的域) 约束状态变量的不变性条件 建立对象状态的并发访问管理策略(规定了如何维护线程安全性) 1、收集同步需求(找出复合操作、多个变量遵循原子性的操作等) 2、依赖状态的操作(找出操作是否基于先验条件,例:取出当队列 阅读全文
posted @ 2016-10-23 11:59 HectorHou 阅读(2095) 评论(0) 推荐(0) 编辑
摘要:我们不仅仅希望防止某个线程使用某个状态时,另一个线程在修改它;我们还希望某个线程修改了某个状态后,其他线程能够看到状态的变化。 一、可见性 重排序:在没有同步的情况下,编译器、处理器可能对代码的执行顺序进行一些调整 例如如下代码,由于没有使用同步机制,读线程可能看不见ready的修改,而一直循环下去 阅读全文
posted @ 2016-10-22 22:12 HectorHou 阅读(1307) 评论(0) 推荐(0) 编辑
摘要:一个对象是否需要是线程安全的取决于它是否被多个线程访问。 当多个线程访问同一个可变状态量时如果没有使用正确的同步规则,就有可能出错。解决办法: 不在线程之间共享该变量 将状态变量修改为不可变的 在访问状态变量时使用同步机制 完全由线程安全类构造的程序也不一定是线程安全的,线程安全类中也可以包含非线程 阅读全文
posted @ 2016-10-22 20:08 HectorHou 阅读(536) 评论(0) 推荐(1) 编辑