我们都知道线程与线程之间是资源共享的,这直接可能导致资源的竞争,资源的安全问题就凸显出来。因此,一般意义上来讲,线程安全问题都是在多线程环境中来讨论的。

  线程是否安全,主要是对某个方法的判定,可以是静态方法或者普通实例方法。

  1. 是否多线程环境

  我们都知道线程与线程之间是资源共享的,这直接可能导致资源的竞争,资源的安全问题就凸显出来。因此,一般意义上来讲,线程安全问题都是在多线程环境中来讨论的。

  1. 对象使用单例模式还是多例模式

  坦白说,不论是单例还是多例都有可能出现线程安全问题。
  首先,就单例而论。比较明显的例子是Servlet,通常web开发中,是不允许servlet中出现实例变量的,只能定义局部变量,在方法内部定义使用变量。多线程情况下,servlet中的实例变量或者静态变量都变成了共享变量,这就有可能出现线程安全的问题,为什么说可能呢?因为还要满足第4点,才会出现导致线程不安全。
  下面讨论多例,不要以为多例就不会出现线程安全问题,大家不要忽略了静态变量,即使是多实例,它们也是共享的哦!

  1. 方法是否使用共享变量

  何为共享变量?这里指的是可能会有多个线程同时访问的变量。比如:单例对象的实例变量和静态变量;多例对象的静态变量。

  1. 方法内部是否有更新操作

  即使上面所有的条件都满足,如果方法中没有对共享变量执行更新操作,该方法是线程安全的。因此,对共享变量的更新操作是线程不安全的必要条件。

文章作者:xiaohui249
本文链接:http://javatech.wang/index.php/archives/83/
版本所有 ©转载时必须以链接形式注明作者和原始出处