首先来介绍下两个基本的概念,进程和线程。

  进程:一个具有独立功能的程序关于某个数据集合的一次运行活动。说白了就是计算机中运行的程序就是进程,比如QQ、各种浏览器、各种播放器,每一种都是一个进程。

  线程:包含在进程之中,是进程中的实际运作单位。进程通过调用线程,完成不同的功能。

  一个对象是否是线程安全的,取决于它是否被多个线程同时访问。其实,与其说线程安全,倒不如说资源安全更为贴切。所以对线程安全给出一个确切的定义是非常复杂的,在网上可以搜到很多定义,比如:

  1、可以在多个线程中调用,并且在线程之间不会出现错误的交错;

  2、可以同时被多个线程调用,而调用者无需执行额外的动作;

这些定义并不能给我们带来太大的帮助,其实在线程安全性的定义中,最核心的概念就是正确性。如果不能清晰地定义正确性,那么对线程安全性的定义肯定会是模糊的。

  正确性的含义是,某个类的行为与其规范完全一致。也就是代码按照我们的定义,能够正确的处理对象以得到我们想要的结果(换句话说,就是指某个类在并发环境和单线程环境中都不会被破坏)。所以,线程安全性可以定义为:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。也就是当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。

其实,线程安全型,是围绕着"正确性"来理解的。