变量的线程安全分析

成员变量和静态变量是否线程安全?

  • 如果没有共享,则线程安全
  • 如果它们共享了,根据它们的状态是否能够改变,又分两种情况
  1. 如果只有读操作,则线程安全
  2. 如果有读写操作,则这段代码是临界区,需要考虑线程安全

局部变量是否线程安全?

  • 局部变量是线程安全的
  • 但是局部变量引用的对象则未必
  1. 如果该对象没有逃离方法的作用访问,它是线程安全的
  2. 如果该对象逃离方法的作用范围,则需要考虑线程安全

 局部变量线程安全分析:

public static void test1(){
    int i=10;
    i++;
}

每个线程调用test1()方法时局部变量i会在每个线程的栈帧内存中被创建多份,因此不存在共享

局部变量的引用稍有不同:如果该引用的作用域在方法之内,引用对象没有暴露给外部,那么是线程安全的,但是如果暴露给外部,那么需要考虑线程安全问题

常见线程安全类 

String、Integer、StringBuffer、Random、Vector、Hashtable、java.util.concurrent包下的类

这里说它们是线程安全的是指,多个线程调用它们同一个实例的方法时,是线程安全的,也可以理解为:

  • 它们的每个方法是原子的
  • 但是注意它们多个方法的组合不是原子的

不可变类线程安全

  • String、Integer等都是不可变的,因为其内部的状态不可以改变,因此它们的方法都是线程安全的
  • 保护性拷贝

猜你喜欢

转载自blog.csdn.net/kidchildcsdn/article/details/113844704