随笔分类 - 多线程与并发
摘要:10 避免活跃性 在安全性与活跃性之间通常存在着某种制衡。例如加锁导致死锁,或者使用线程池和信号量来限制对资源的使用,但这些被限制的行为可能会导致资源死锁。、 10.1 死锁 当一个线程永远地持有一个锁,并且其他线程都尝试获得这个锁时,那么它们将永远被阻塞。 10.1.1 锁顺序死锁 如果用固定的顺序来获取锁,就不会发生死锁。 10.1.2动态的锁顺序死锁解决方案 其中一个线程...
阅读全文
摘要:7 取消与关闭 7.1.5通过Future来实现取消 Future.get抛出异常,当你知道不在需要这个结果,可以调用Future.caneel来取消任务。 7.1.6 处理不可中断的阻塞(非标准的取消) 在Java库中,许多可阻塞的方法都是通过提前返回或者抛出InterruptedException来响应中断请求的,然而,并非所有的可阻塞方法或者阻塞机制都能响应中断;如果一个线程由于执行...
阅读全文
摘要:5 基础构建模块 Java平台类库包含了丰富的并发基础构建模块,例如线程安全的容器类以及各种用于协调多个相互协作的线程控制流的同步工具类(Synchronizer)。本章将介绍其中一些最有用的并发构建模块。 5.1同步容器类 同步容器类包括Vector和Hashtable,二者是早期JDK的一部分,此外还包括在JDK 1.2 中添加的一些功能相似的类,这些同步的封装器类是由Collect...
阅读全文
摘要:6 任务执行 大多数并发应用程序都是围绕"任务执行(Task Execution)"来构造的。理想情况下,各个任务之间是相互独立的:任务并不依赖于其他任务的状态、结果或边界效应。当负荷过载时,应用程序的性能应该是逐渐降低,而不是直接失败。所以应该选择清晰的任务边界以及明确的任务执行策略。 A: 找出清晰的任务边界 大多数服务器应用程序都提供了一种自然的任务边界选择方式:以独立的客户请求为边...
阅读全文
摘要:8 线程池 8.1 如何解决任务和执行策略之间的耦合性问题? 8.1.1任务与策略存在哪几种耦合性? a:依赖性任务 如果提交给线程池的任务需要依赖其他的任务,那么就隐含地给执行策略带来了约束,此时必须小心地维持这些执行策略以避免产生活跃性问题。 b:使用线程封闭机制的任务 任务要求其执行所,在的Executo:是单线程的。如果将Executor从单线程环境改为线程池环境,那么将会失去线程安全性。...
阅读全文
摘要:4 对象的组合 组合模式能够使一个类更容易成为线程安全的,并且在维护这些类时不会无意中破坏类的安全性保证。 4.1设计线程安全的类 设计线程安全类的三个基本要素: A: 找出构成对象状态的祈有变童。 B: 找出钓束状态变量的不变性条件 C: 建立时象状态的并发访问管理策略 例如,LinkedList的状态就包括该链表中所有节点对象的状态。 4.1.1收集同步需求 4.1.2 依赖状态的操作 类...
阅读全文
摘要:3 对象的共享 3.1 可见性 我们不仅希望防止某个线程正在使用对象状态而另一个线程在同时修改该状态,而且希望确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化。因此就需要通过显式的同步或者类库中内置的同步来保证对象被安全地发布。 3.1.1 失效数据 3.1.2 非原子的64位操作 JVM允许将64位的读操作或写操作分解为两个32位的操作。当读取一个非volatile类型的long变...
阅读全文
摘要:2 线程安全 核心就是在访问对象的可变状态时,进行正确的管理。 2.1 对象及状态 对象的状态(也可理解为属性)是指存储在状态变量(例如实例或静态域)中的数据。对象的状态可能包括其他依赖对象的域。例如,某个HashMap的状态不仅存储在HashMap对象本身,还包含集合里面存储的对象。 如何安全地访问可变状态的变量? A: 不在多个线程之间共享(定义为私有) B:定义为final C: 使用同步 ...
阅读全文

浙公网安备 33010602011771号