背景
线程安全是多线程领域的问题,线程安全可以简单理解为一个方法或者一个实例可以在多线程环境中使用而不会出现问题。
产生线程不安全的原因
在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。如,同一内存区(变量,数组,或对象)、系统(数据库,web services等)或文件。实际上,这些问题只有在一或多个线程同时向这些资源进行写操作时,才可能发生。
只要资源没有发生变化,多个线程读取相同的资源仍然是安全的。
竞态条件(Race condition) & 临界区(Critical Regions)
当两个线程同时修改同一资源时,就存在竞态条件(Race condition) 。导致竞态条件发生的代码区称作临界区(Critical Regions)。
通过在临界区中使用适当的同步机制(synchronization),比如互斥锁(mutex),就可以避免竞态条件。
线程安全(Thread Safety)
当一个可变(mutable)对象会被多个线程访问时,就要考虑这个线程是不是需要被设计成线程安全的。
一个类会被称为**线程安全(thread-safe)**的,当它被从多个线程访问,而且无论这些线程如何被调度(scheduling)和交叉(interleaving)执行,而且在调用代码(calling code)中不需要额外的同步(synchronization)或者其他协调(coordiantion)机制,它的行为仍然正确(若预期执行)。
换句话说,线程安全的类封装(encapsulate)了已经需要的同步机制,因此客户端或者说调用者不再需要关注或者提供这些同步机制。
...