![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
成分sjz
路漫漫
展开
-
并发编程----线程安全性
编写线程安全的代码的核心是要对状态访问操作进行管理,尤其是对共享的和可变的状态访问。 这里的对象的状态可以看成是存储在状态变量(例如实例或静态域)中的数据。1.什么是线程安全线程安全性定义中最核心的是概念是正确性。 正确性的含义是:某个类的行为和规范完全一致。在良好的规范中通常会定义各种不变性条件来约束对象,以及定义各种后验条件来描述对象操作的结果。 在正确性定义的基础上,线程安全性的定...原创 2018-06-12 20:45:09 · 138 阅读 · 0 评论 -
并发编程---显式锁
1,Lock与ReentrantLock 1.1,ReentrantLock不是替代内置加锁的方法,而是当内置加锁不适用时,作为一种可选的高级功能,如:可定时的、可轮询的,与可中断的锁获取操作,公平队列,以及非块结构的锁。一般应该优先使用synchronized。 1.2,Lock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作,在Lock的实现中必须提供与内部锁相同的内存可见性...原创 2018-07-07 22:55:22 · 117 阅读 · 0 评论 -
并发编程----原子变量与非阻塞同步机制
1,近年来,在并发算法领域的大多数研究都侧重于非阻塞算法,这种算法用底层的原子机器指令(例如比较并交换指令)代替锁来确保数据在并发访问中的一致性。2,与基于锁的方案相比,非阻塞算法在设计和实现上都要复杂得多,但它们在可伸缩性和活跃性上却拥有巨大的优势。3,锁的劣势 3.1,当有多个线程同时请求锁时,JVM需要借助操作系统的功能,将线程挂起并且在稍后恢复运行。当锁上存在着激烈的竞争时,调度开销...原创 2018-07-13 01:25:22 · 137 阅读 · 0 评论 -
并发编程---并发编程的测试
并发程序中潜在错误的发生并不具有确定性,而是随机的。安全性测试:通常会采用测试不变性条件的形式,即判断某个类的行为是否与其规范保持一致活跃性测试:进展测试和无进展测试两方面,这些都是很难量化的(性能:即吞吐量,响应性,可伸缩性测试) 一、正确性测试重点:找出需要检查的不变性条件和后验条件1、对基本单元的测试——串行的执行 1 public class BoundedBufferTests {...原创 2018-07-03 20:18:10 · 158 阅读 · 0 评论 -
并发编程---构建自定义的同步工具
1,状态依赖性的管理: 1.1,在单线程程序中,如果某一个基于状态的前提条件未得到满足,则这个条件将永远无法成真,可是,在并发程序中,基于状态的条件可能由于其他线程的操作而改变2,条件队列: 2.1,他使得一组线程能够通过某种方式来等待特定的条件变为真。传统队列的元素是一个一个数据,而条件队列中的元素是一个一个正在等待相关条件的线程 2.2,Object.wait会自动释放锁,并请求操作...原创 2018-07-08 19:29:02 · 111 阅读 · 0 评论 -
并发编程---任务执行
任务:通常是一些抽象的且离散的工作单元。大多数并发应用程序都是围绕"任务执行"来构造的,把程序的工作分给多个任务,可以简化程序的组织结构便于维护 一、在线程中执行任务任务的独立性:任务并不依赖于其他任务的状态,结果和边缘效应。独立的任务可以实现并行执行1、串行的执行任务所有的任务放在单个线程中串行执行,程序简单,安全性高,不涉及同步等情况,缺点也显而易见,无法提高吞吐量和响应速度,适合任务数量...原创 2018-06-19 21:39:44 · 175 阅读 · 0 评论 -
并发编程---性能与可伸缩性
线程的最主要目的是提高程序的运行性能,但性能的提升会导致复杂性的提升,又会导致安全性和活跃性的风险 一、对性能的思考提升性能意味着用更少的资源做更多地事情。要想通过并发来获得更好的性能,就要更有效地利用现有处理资源线程使用的额外的性能开销:线程之间的协调(例如加锁、触发信号以及内存同步等),增加的上下文切换,线程的创建和销毁,以及线程的调度等1、性能与可伸缩性(多块vs多少)性能通过服务时间、...原创 2018-06-25 23:35:13 · 198 阅读 · 0 评论 -
并发编程---- 基础构建模块
委托是创建线程安全类的一个最有效的策略:只需让现有的线程安全类管理所有的状态即可。一、同步容器类1、同步容器类的问题 同步容器类都是线程安全的,容器本身内置的复合操作能够保证原子性,但是当在其上进行客户端复合操作则需要额外加锁保护其安全性 由于同步容器类要遵守同步策略,即支持客户端加锁,但必须清楚加入同一个锁2、迭代器与ConcurrentModificationException 及时...原创 2018-06-18 12:06:53 · 162 阅读 · 0 评论 -
并发编程----避免活跃性的危险
安全性和活跃性之间存在某种制衡: 使用加锁机制来确保线程安全,但如果过度使用加锁,则可能导致锁顺序死锁(Lock-Ordering Deadlock)。同样,使用线程池和信号量来限制对资源的使用,但这些被限制的行为可能会导致资源死锁(Resource Deadlock)10.1 死锁经典的“哲学家进餐”问题很好地描述了死锁状况。 5个哲学家围坐在一个圆桌上,每两个哲学家之间都有一只筷子,哲学...原创 2018-06-23 20:02:48 · 255 阅读 · 0 评论 -
并发编程---对象的共享
一、可见性重排序:在没有同步的情况下,编译器、处理器可能对代码的执行顺序进行一些调整例如如下代码,由于没有使用同步机制,读线程可能看不见ready的修改,而一直循环下去;也可能由于重排序,看到了ready的修改number仍没修改而输出01、失效数据在缺少同步的程序中产生错误的结果的一种情况。造成程序的不确定性。2、非原子的64位操作即使是失效数据也是程序过去运行中产生的数据。但执行非原子的6...原创 2018-06-14 23:43:22 · 96 阅读 · 0 评论 -
并发编程---线程池的使用
一、在任务和执行策略之间隐性耦合Executor框架将任务的提交和它的执行策略解耦开来。虽然Executor框架为制定和修改执行策略提供了相当大的灵活性,但并非所有的任务都能适用所有的执行策略。依赖性任务:依赖其他同步任务的结果,使其不得不顺序执行,影响活跃性使用线程封闭的任务:在单线程的Executor中执行,任务可以不是线程安全的,但是一旦提交到线程池时,就会失去线程安全对响应时间敏感的任...原创 2018-06-21 23:12:32 · 169 阅读 · 0 评论 -
并发编程---取消与关闭
Java没有提供任何机制来安全地终止线程(虽然Thread.stop和suspend方法提供了这样的机制,但由于存在缺陷,因此应该避免使用中断:一种协作机制,能够使一个线程终止另一个线程的当前工作立即停止会使共享的数据结构处于不一致的状态,需要停止时,发出中断请求,被要求中断的线程处理完他当前的任务后会自己判断是否停下来 一、任务取消若外部代码能在某个操作正常完成之前将其置入“完成”状态,则还...原创 2018-06-20 22:08:43 · 163 阅读 · 0 评论 -
并发编程---java内存模型
一、什么是内存模型,为什么需要它Java内存模型(Java Memory Model)并发相关的安全发布,同步策略的规范、一致性等都来自于JMM。1 平台的内存模型在架构定义的内存模型中将告诉应用程序可以从内存系统中获得怎样的保证,此外还定义了一些特殊的指令(称为内存栅栏或栅栏),当需要共享数据时,这些指令就能实现额外的存储协调保证。JVM通过在适当的位置上插入内存栅栏来屏蔽在JVM与底层平台...原创 2018-07-13 23:07:17 · 99 阅读 · 0 评论