Java并发编程实践——读书笔记

《Java并发编程实践》读书笔记(一)

第一章 简介

  • 线程的优点:使用多处理器、模型的简化、对异步事件的简单处理、用户界面的更佳响应性(避免ANR)
  • 线程的风险:

    1. 安全危险:多线程中的各个操作顺序是不可预测的(竞争条件),为了使多线程程序的行为可预见,访问共享的变量必须经过合理的协调==>Java提供了同步机制
    2. 活跃度的危险:死锁(deadlock)、饥饿(starvation)、活锁(livelock)。线程的使用引入了活跃度失败(liveness failure),例如:如果线程A等待一个线程B独立占有的资源,B永远不释放这个资源,A将永远等待下去。
    3. 性能危险:①线程切换(上下文切换)带来的巨大的系统开销,②同步机制会限值编译器的优化(个人理解:多个线程访问同一块内存导致内存总线负载增加)
    4. 线程无处不在:即使你的程序没有显示的创建线程,并不代表不需要考虑线程安全。当JVM启动后,它会创建一些线程来进行自身的常规管理(垃圾回收、终结处理),以及一个运行main函数的主线程。原文中有一句:“线程安全的需要并不仅仅在于框架调用的组件——只要它处于组件访问过的程序状态段,它就会扩展到所有代码路径。因此,线程安全的需要是具有传递性的。”

    第二章 线程安全

  • 编写线程安全的代码,本质上是管理对状态的访问,而且通常是共享的,可变的状态==>真正要做的是:在不可控制的并发访问中保护数据。

  • 什么时候使用同步机制:只要有多于一个的线程访问给定的状态变量,而且其中的某个线程会写入该变量。Java中的同步机制:①synchronized代码块,②volatile关键字、③显示锁和原子变量的使用。
    一个线程安全程序是完全由线程安全类构成的吗? ==>完全由线程安全类构成的程序未必是线程安全的,线程安全程序也可以包含非线程安全的类。
  • 线程安全性:一个类是线程安全的,是指在被多个线程访问时,类可以持续进行正确的行为。

    当多个线程访问一个类时,若不用考虑这些线程在运行时环境下的调整和交替执行,并且不需要额外的同步及在调用方代码不必做其他的协调,这个类的行为仍然是正确的,那么称这个类是线程安全的。

  • 对于线程安全类的实例进行顺序或并发的一系列操作,都不会导致实例处于无效状态。