[Java Concurrency in Practice]二至五章小结

下面这个”并发技巧清单“列举了在第一部分(二至五章)中介绍的主要概念和规则。

  • 可变状态是至关重要的(It’s the mutable state,stupid)。

    所有的并发问题都可以归结为如何协调对并发状态的访问。可变状态越少,就越容易确保线程安全性。

  • 尽量将域声明为final类型,除非需要它们是可变的。
  • 不可变对象一定是线程安全的。

    不可变对象能极大地降低并发编程的复杂性。它们更为简单而且安全,可以任意共享而无须使用加锁或保护性复制等机制。

  • 封装有助于管理复杂性。

    在编写线程安全的程序时,虽然可以将所有的数据都保存在全局变量中,但为什么要这样做?将数据封装在对象中,更易于维持不变性条件:将同步机制封装在对象中,更易于遵循同步策略。

  • 用锁来保护每个可变变量。
  • 当保护同一个不变性条件中的所有变量时,要使用同一个锁。
  • 在执行复合操作期间,要持有锁。
  • 如果从多个线程中访问同一个可变变量时没有同步机制,那么程序会出现问题。
  • 不要故作聪明地推断出不需要使用同步。
  • 在设计过程中考虑线程安全,或者在文档中明确地指出它不是线程安全的。
  • 将同步策略文档化。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-08 09:41:33

[Java Concurrency in Practice]二至五章小结的相关文章

[Java Concurrency in Practice]第五章 基础构建模块

基础构建模块 委托时创建线程安全类的一个最有效的策略,只需让现有的线程安全类管理所有的状态即可. 平台类库中包含了一个并发构建块的丰富集合,如线程安全的容器与同步工具. 5.1 同步容器类 分两部分,一是JDK1.0的Vector与Hashtable,另一个是JDK1.2才被加入的同步包装类Collections.synchronizedXxx工厂方法创建的.Collections.synchronizedXxx工厂方法构造出的容器返回的List与Set的iterator()与listItera

[Java Concurrency in Practice]第三章 对象的共享

对象的共享 第二章介绍了如何通过同步来避免多个线程在同一时刻访问相同的数据,而第三章则介绍如何共享和发布对象,从而使它们能够安全地由多个线程同时访问.这两章合在一起就形成了构建线程安全类以及通过java.util.concurrent类库来构建并发应用程序的重要基础. synchronized不仅仅只有原子性,还具有内存可见性.我们不仅希望防止某个线程正在使用对象状态而另一个线程在同时修改该状态,而且希望确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化.如果没有同步,那么这种情况就

[Java Concurrency in Practice]第七章 取消与关闭

取消与关闭 要使任务和线程能安全.快速.可靠地停止下来,并不是一件容易的事.Java没有提供任何机制来安全地终止线程(虽然Thread.stop和suspend方法提供了这样的机制,但由于存在缺陷,因此应该避免使用).但它提供了中断,这是一种协作机制,能够使一个线程终止另一个线程的当前工作. 这种协作式的方法是必要的,我们很少希望某个任务.线程或服务立即停止,因为这种立即停止会使共享的数据结构处于不一致的状态.相反,在编写任务和服务时可以使用一种协作的方式:当需要停止时,它们首先会清除当前正在执

JAVA: httpclient 详解——第五章;

相对于httpurlconnection ,httpclient更加丰富,也更加强大,其中apache有两个项目都是httpclient,一个是commonts包下的,这个是通用的,更专业的是org.apache.http.包下的,所以我一般用后者: httpclient可以处理长连接,保存会话,重连接,以及请求过滤器,连接重用等等... 下面是测试代码(全部总结来自官方文档,以及翻译) 须要下载核心包:httpclient-4.3.4.jar ,也可在官网下载:http://hc.apache

Java Concurrency in Practice 4.1-4.2相关问题及理解

今天终于又重新拿起了Java Concurrency in Practice,之前被虐的体无完肤,在看这本书之前,有一部分自己写的代码我根本没意识到是线程不安全的,还真的是要恶补这方面的知识. 1.Java监视器模式 监视器模式其实很简单,就是用私有对象的锁或者内置锁来保证所属对象的线程安全性.这里引入一个例子:车辆追踪 public class MonitorVehicleTracker { private final Map<String, MutablePoint> locations;

“全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第三十五章:如何获取线程被等待的时间? 下一章 "全栈2019"Java多线程第三十六章:如何设置线程的等待截止时间 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复&qu

JAVA: httpclient 具体解释——第五章;

httpclient 具体解释--第一章: httpclient 具体解释--第二章: httpclient 具体解释--第三章: httpclient 具体解释--第四章: httpclient 具体解释--第五章: httpclient 具体解释--第六章: httpclient 具体解释--第七章: 相对于httpurlconnection ,httpclient更加丰富,也更加强大,当中apache有两个项目都是httpclient,一个是commonts包下的,这个是通用的,更专业的是

[Java Concurrency in Practice]第二章 线程安全性

线程安全性 要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享和可变的状态的访问. 对象的状态是指存储在状态变量(例如实例或静态域)中的数据.对象的状态可能包括在其他依赖对象的域.例如,某个HashMap的状态不仅存储在HashMap对象本身,还存储在许过Map.Entry对象中.在对象的状态中包含了任何可能影响其外部可见行为的数据. "共享"意味着变量可以由多个线程同时访问,而"可变"则意味着变量的值在其生命周期内可以发生变化. 一个对象是否需

java并发编程实战(java concurrency in practice)

第一章 线程共享进程范围内的资源,但每个线程都有各自的程序计数器.栈以及局部变量等. 多个线程可以同时调度到多个CPU上运行. 线程的优势? 在服务应用程序中,可以提升资源利用率以及系统吞吐率,发挥多处理器的强大功能. 线程的优先级  执行时间  线程切换需要额外的开销 第二章 如果多个线程访问同一个可变的状态变量是没有使用合适的同步,那么程序就会出现错误,有以下三种方法修复这种问题. 1.不在线程之间共享该状态变量 2.将状态变量改为不可变的变量 3.在访问状态变量时使用同步 什么是线程安全?