第一章
- 并发历史
从头到尾只执行一个程序——>可以执行多个程序(操作系统,进程出现)——>线程出现(轻量级进程,一个进程可以运行有线程)
- 并发的好处
- 发挥多处理器的强大能力
- 建模简单化
- 异步事件的简化处理
- 响应更灵敏的界面
- 并发的坏处
- 安全性问题(数据错乱)
- 活跃性问题(死锁,饥饿,活锁)
- 性能问题(上下文切换带来的开销,同步机制抑制编译器优化,增加共享内存的同步流量)
- 并发无处不在
因为jvm本身就会有其他线程存在,引入框架或者使用一些工具类或者调用RMI等等情况,往往也会跟着引进并发。
第二章
编写线程安全的代码,核心是对状态访问操作进行管理,特别是对共享的和可变的状态的访问。
对象的状态,指存储在状态变量(实例或静态域)中的数据,还可能包括其他依赖对象的域。
一个对象是否需要线程安全,取决于是否被多个线程访问。
“同步”机制包括synchronized,volatile,显示锁,原子变量。
线程安全性问题有三种方式修复:
1.不在线程之间共享该状态变量
2.将状态变量修改为不可变的变量
3.在访问状态变量时使用同步
程序状态的封装性越好,就越容易实现程序的线程安全性,并且代码的维护人员也越容易保持这种方式。
当设计线程安全的类时,良好的面向对象技术,不可修改性,以及明晰的不变性规范都能起到一定的帮助作用。
面向对象中的抽象和封装会降低程序的性能。
但是对于编写并发程序,正确的做法是:首先使得代码运行正确,然后再提高的代码的执行速度。
即便如此,最好也只是当性能测试结果和应用需求要求你提高性能,以及测试结果表明这种优化在实际中确实能带来性能优化时,才进行优化。
- 什么是线程安全性
- 当多个线程访问某个类的时候,这个类始终都能表现出正确的行为,那么称这个类是线程安全的。
- 正确性:大概就是将类在单线程运行的结果为正确的行为。
- 线程安全类:对安全类的对象在并行或者串行的环境下,调用公有方法和对公有域进行读、写操作,都能得到正确的行为或者不会使得对象无效。