第一章

  1. 并发历史
    从头到尾只执行一个程序——>可以执行多个程序(操作系统,进程出现)——>线程出现(轻量级进程,一个进程可以运行有线程)
  2. 并发的好处
    • 发挥多处理器的强大能力
    • 建模简单化
    • 异步事件的简化处理
    • 响应更灵敏的界面
  3. 并发的坏处
    • 安全性问题(数据错乱)
    • 活跃性问题(死锁,饥饿,活锁)
    • 性能问题(上下文切换带来的开销,同步机制抑制编译器优化,增加共享内存的同步流量)
  4. 并发无处不在
    因为jvm本身就会有其他线程存在,引入框架或者使用一些工具类或者调用RMI等等情况,往往也会跟着引进并发。

第二章

编写线程安全的代码,核心是对状态访问操作进行管理,特别是对共享的和可变的状态的访问。
对象的状态,指存储在状态变量(实例或静态域)中的数据,还可能包括其他依赖对象的域。
一个对象是否需要线程安全,取决于是否被多个线程访问。
“同步”机制包括synchronized,volatile,显示锁,原子变量。

线程安全性问题有三种方式修复:
1.不在线程之间共享该状态变量
2.将状态变量修改为不可变的变量
3.在访问状态变量时使用同步

程序状态的封装性越好,就越容易实现程序的线程安全性,并且代码的维护人员也越容易保持这种方式。
当设计线程安全的类时,良好的面向对象技术,不可修改性,以及明晰的不变性规范都能起到一定的帮助作用。

面向对象中的抽象和封装会降低程序的性能。
但是对于编写并发程序,正确的做法是:首先使得代码运行正确,然后再提高的代码的执行速度。
即便如此,最好也只是当性能测试结果和应用需求要求你提高性能,以及测试结果表明这种优化在实际中确实能带来性能优化时,才进行优化。
  1. 什么是线程安全性
    • 当多个线程访问某个类的时候,这个类始终都能表现出正确的行为,那么称这个类是线程安全的。
    • 正确性:大概就是将类在单线程运行的结果为正确的行为。
    • 线程安全类:对安全类的对象在并行或者串行的环境下,调用公有方法和对公有域进行读、写操作,都能得到正确的行为或者不会使得对象无效。