线程安全
Brian Goetz在《Java Concurrency In Practice》中提出线程安全的定义:当多个线程访问一个对象的时候,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进额外的同步,或者在调用方法进行任何其他的协调操作,调用这个对象的行为都可以获得正确结果,那么这个对象就是线程安全的。
1/1 Java语言中的线程安全
我们可以将Java语言中各种操作共享的数据分为以下5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。
- 不可变:在JDK1.5以后,不可变的对象一定是线程安全的。
- 绝对线程安全:完全满足Brian Goetz提出的线程安全的定义就是绝对线程安全。Java API中标注自己是线程安全的类大多数都不是绝对的线程安全,比如Vector。
- 相对线程安全:相对线程安全就是我们通常意义上所讲的线程安全,它需要保证这个对象单独的操作是线程安全的,我们调用的时候不需要额外的安全措施,但是对于特定顺序的连续调用,就可能需要在调用端额外的同步手段来保证调用的正确性。
- 线程兼容:线程兼容是指对象本身并不是线程安全的,但是可以通过在调用端正确的使用同步手段来保证对象在并发环境中可以安全的使用,我们说一个类不是线程安全的,绝大多数是这种情况。
- 线程对立:线程对立是无论是否采取了同步措施,都无法在多线程环境中并发使用的代码。这个在Java语言中几乎不存在。
1/2 线程安全的实现方法
- **互斥同步: **