并发
文章平均质量分 90
在咖啡里溺水的鱼
选择了它,就要爱它。充满激情,全神贯注。
展开
-
Java并发编程学习——《Java Concurrency in Practice》学习笔记 1.简介
1.1 并发简史线程也被称为轻量级进程。在大多数现代操作系统中,都是以线程为基本的调度单位,而不是进程。1.2 线程的优势发挥多处理器的强大能力简化建模的复杂度简化异步事件的处理使用户界面响应的更加灵敏1.3 线程带来的问题安全性问题活跃性问题 —— 某件正确的事情最终会发生性能问题1.4 线程无处不在框架通过在框架线程中调用应用程序代码将...原创 2017-11-27 18:10:21 · 257 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》13.显式锁
需要支持轮询、定时的锁?需要可中断锁获取操作的锁?在非块结构中想要使用锁?了解支持更高级操作的显式锁。Java 5.0新增ReentrantLock并不是一种替代内置加锁的方法,而是当内置加锁机制不适用时,作为一种可选的高级功能。13.1 Lock与ReentrantLockReentrantLock实现了Lock接口,提供了与synchronized相同的互斥性和内存...原创 2018-04-23 23:38:05 · 279 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》12.并发程序的测试
本章节的内容介绍了如何对并发程序进行测试,与普通程序进行测试的区别,测试过程中应当注意的问题,可以使用的技巧和方法等12.1 正确性测试在为并发类设计单元测试时,首先需要执行与测试串行类时相同的分析——找出需要检查的不变形条件和后验条件。12.1.1 基本的单元测试进行并发程序测试时,包含一组串行测试通常是有帮助的,它们有助于在开始分析数据竞争之前就找出与并发性无关的问...原创 2018-04-23 23:35:56 · 339 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》11.性能与可伸缩性
本章内容介绍了并发编程中,最吸引人的性能问题。什么会导致性能问题,如何解决性能问题,我们应该在什么情况下着手解决性能问题?首先要保证程序能正确运行,然后仅当程序的性能需求和测试结果要求程序执行的更快时,才应该设法提高它的运行速度11.1 对性能的思考尽管使用多个线程的目标是提升整体性能,但与单线程的方法相比,使用多个线程总会引入一些额外的性能开销。要想通过并发来获得更好...原创 2018-04-23 23:34:13 · 264 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》10.避免活跃性危险
死锁是并发编程中最容易遇到的活跃性问题,本章就死锁发生的原因、诊断、避免死锁的方案进行了细致的解读。10.1 死锁在线程A持有锁L并想获得锁M的同时,线程B持有锁M并尝试获得锁L,那么这两个线程将永远的等待下去。这种情况是最简单的死锁形式,称为 抱死 Deadly Embrace。数据库系统的设计中考虑了检测死锁以及从死锁中恢复。当检测到一组事务发生了死锁时,将选择一个牺牲者并...原创 2018-04-23 23:31:48 · 441 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》8.线程池的使用
8.1 在任务与执行策略之间的隐性耦合虽然Executor框架为指定和修改执行策略都提供了相当大的灵活性,但并非所有的任务都能适用所有的执行策略。有些类型的任务需要明确的指定执行策略:依赖性任务如果提交给线程池的任务需要依赖其他任务,那么就隐含的给执行策略带来了约束。此时必须小心的维持这些执行策略以避免产生活跃性问题。使用线程封闭机制的任务单线程的Executor能够对...原创 2018-03-25 14:07:56 · 318 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》7.取消与关闭
Java没有提供任何机制来安全的终止线程。(Thread.stop 和 suspend 等方法存在着一些严重缺陷,应该避免使用)。但它提供了中断 Interruption,中断是一种协作机制,能够使一个进程终止另一个进程的当前工作。一个行为良好的软件与勉强运行的软件之间的最主要区别就是,行为良好的软件能很完善的处理失败、关闭和取消等过程。7.1 任务取消如果外部代码能在某个操作正常...原创 2018-03-25 13:47:33 · 362 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》学习笔记 6.任务执行
大多数并发应用程序都是围绕 任务执行 Task Execution 来构造的:任务通常是一些抽象的且离散的工作单元。通过把应用程序的工作分解到多个任务中,可以简化程序的组织结构,提供一种自然的事务边界来优化错误恢复过程,以及提供一种自然的并行工作结构来提升并发性。6.1 在线程中执行任务当围绕 任务执行 来设计应用程序结构时,第一步就是要找出清晰的任务边界。在理想情况下,各个任务之间是...原创 2017-11-27 18:15:10 · 420 阅读 · 0 评论 -
Java并发编程学习——《Java Concurrency in Practice》学习笔记 并发技巧清单
并发技巧清单可变状态是至关重要的 所有的并发问题都可以归结为如何协调对并发状态的访问。可变状态越少,就越容易确保线程安全性。尽量将域声明为final类型,除非需要它们是可变的不可变对象一定是线程安全的 不可变对象能极大的降低并发编程的复杂性。它们更为简单而且安全,可以任意共享而无需使用加锁或保护性复制等机制。封装有助于管理复杂性 将数据封装在对象中,更易于维持不变性条件:将同步机制封...原创 2017-11-27 18:14:34 · 279 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》学习笔记 5.基础构建模块
5.1 同步容器类同步容器类包括Vector、Hashtable,以及JDK1.2中添加的一些功能相似的类,这些同步的封装器类是由Collections.synchronizedXxx等工厂方法创建的。这些类实现线程安全的方式是:将它们的状态封装起来,并对每个共有方法都进行同步,使得每次只有一个线程能访问容器的状态。(但这些类基本都被淘汰了)5.1.1 同步容器类的问题同步容器类都...原创 2017-11-27 18:13:45 · 334 阅读 · 0 评论 -
Java并发编程学习——《Java Concurrency in Practice》学习笔记 4.对象的组合
4.1 设计线程安全的类通过使用封装技术,可以使得在不对整个程序进行分析的情况下就可以判断一个类是否是线程安全的。再设计线程安全类的过程中,要包含的三个基本要素: - 找出构成对象状态的所有变量 - 找出约束状态变量的不变性条件 - 建立对象状态的并发访问管理策略分析对象的状态时,首先从对象的域开始。如果对象中所有的域都是基本类型的变量,那么这些域将构成对象的全部状态。如果在对象...原创 2017-11-27 18:13:04 · 283 阅读 · 0 评论 -
Java并发编程学习——《Java Concurrency in Practice》学习笔记 3.对象的共享
3.1 可见性在没有同步的情况下,编译器、处理器以及运行时都可能对操作的执行顺序进行一些意想不到的调整。因为它们会对代码的执行顺序进行“重排序”。在缺乏足够同步的多线程程序中,要想对内存操作的执行顺序进行判断,几乎无法得出正确的结论。 重排序 重排序指的是编译器和处理器为了优化程序性能而对指令序列进行重新排序的手段 重排序主要分为两类:编译器优化的重排序、指令级别并行的重排...原创 2017-11-27 18:12:20 · 408 阅读 · 0 评论 -
Java并发编程学习——《Java Concurrency in Practice》学习笔记 2.线程安全性
概述如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误。有三种方式可以修复这个问题: - 不在线程之间共享该状态变量 - 将状态变量修改为不可变的变量 - 在访问状态变量时使用同步Java语言没有强制要求将状态都封装在类中,然而,程序状态的封装性越好,就越容易实现程序的线程安全性。在某些情况中,良好的面向对象设计技术与实际情况的需求并不一致。在这些情...原创 2017-11-27 18:11:21 · 286 阅读 · 0 评论 -
深入了解Java并发——《Java Concurrency in Practice》14.构建自定义的同步工具
虽然章节的目的是介绍如何基于AQS等基类来构建自定义的同步工具,但详细的介绍了AQS的原理,并且详细的讲解了java.util.concurrent类库中许多基于AQS的常用同步工具对AQS的实现及原理。了解AQS之后对ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWritLock、FutureTask都会有一个全新的认识和豁然开朗的...原创 2018-04-23 23:42:19 · 715 阅读 · 0 评论