变量的线程安全分析

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

  • 如果没有共享,则线程安全
  • 如果它们共享了,根据它们的状态是否能够改变,又分两种情况
  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等都是不可变的,因为其内部的状态不可以改变,因此它们的方法都是线程安全的
  • 保护性拷贝
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值