并发编程实战笔记

316 阅读3分钟

如果用同步协调来对某个变量的访问,那么访问这个变量的所有位置上都需要使用同步。

  1. 线程也被称为轻量级进程。
  2. 线程是最小的调度单元,而不是进程。
  3. 串行编程模型的优势在于其直观性和简单性。
  4. 使用多线程还有助于在单处理器系统上获得更高的吞吐率。
  5. 一个进程中的所有线程都将共享进程的内存空间。
  6. 由于多个线程要共享相同的内存地址空间,并且是并发运行,因此它们可能会访问或修改其他线程正在使用的变量。
  7. 在没有充足同步的情况下,多个线程中的操作执行顺序是不可预测的,甚至会产生奇怪的结果。
  8. 如果错误地假设程序中的操作将按照某种特定顺序来执行,那么会存在各种可能的危险。
  9. 要是多线程程序的行为可以预测,必须对共享变量的访问操作进行协同,这样才不会在线程之间发生彼此干扰。
  10. 如果没有同步,那么无论编译器、硬件还是运行时,都可以随意安排操作的执行时间和顺序,例如对寄存器或者处理器中的变量进行缓存,而这些被缓存的变量对其他线程来说是暂时(甚至永久)不可见的。
  11. 安全性的含义是“永远不发生糟糕的事情”。
  12. 导致活跃性问题的错误是难以分析的,因为它依赖于不同线程的事件发生时序,因此在开发或者测试中并不总是能够重现。
  13. 活跃性意味着某件正确的事情最终会发生,但是却不够好,因为我们通常希望正确的事情尽快发生。
  14. 一个对象是否需要是线程安全的,取决于它是否被多线程访问。
  15. 线程安全类中也可以包含非线程安全的类。
  16. 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调用代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就成这个类是线程安全的。
  17. 在线程安全类中封装了必要的同步机制,因此客户端无须进一步采取同步措施。
  18. Java中的主要同步机制是关键字synchronized,它提供了一种独占的加锁方法,但是“同步”这个术语还包括volatile类型的变量,显示锁(Explicit Lock)以及原子变量。
  19. 在并发编程中,由于不恰当的执行时序而出现不正确的结果是一种非常糟糕的情况,它有一个正式的名字:竞态条件。
  20. 竞态条件并不总是会产生错误,还需要某种不恰当的执行时序。
  21. 原子操作是值,对于访问同一个状态的所有操作(包括该操作本身)来说,这个操作时以一个原子方式执行的操作。
  22. 要保持状态一致性,就需要在单个原子操作中更新所有相关的状态变量。
  23. 内置锁也成为监视器锁。
  24. 如果某个线程视图获得一个已经由它自己持有的锁,那么这个请求就会成功。“重入”意味着获取锁的操作的粒度是“线程”,而不是“调用”。
  25. 如果用同步协调来对某个变量的访问,那么访问这个变量的所有位置上都需要使用同步。

IMG_1410.JPG