[Java 并发编程] 9. 线程安全和不变性


一、线程安全和不变性

竞争条件只发生在多个线程同时访问相同资源,并且存在一个或多个线程修改了共享资源,如果多个线程只读共享资源那么不会产生竞争条件。

下面我们通过一个实例来说明当一个共享资源被多个线程访问,但没有线程修改共享资源时不会产生竞争条件。

public class ImmutableValue{

  private int value = 0;

  public ImmutableValue(int value){
    this.value = value;
  }

  public int getValue(){
    return this.value;
  }
}

请注意 ImmutableValue 提供了一个传入指定 value 的构造函数,一旦对象被创建,该对象没有提供任何修改value值的方法,所以value的值无法被修改。

特别注意:对象引用不是线程安全的

需要注意的是,当一个对象不可变时对象本身是线程安全的,但是对象的引用可能不是线程安全的。举例:

public class Calculator{
  private ImmutableValue currentValue = null;

  public ImmutableValue getImmutableValue(){
    return currentValue;
  }

  public void setImmutableValue(ImmutableValue newValue){
    this.currentValue = newValue;
  }

  public void add(int newValue){
    this.currentValue = new ImmutableValue(currentValue.getValue() + newValue);
  }
}

Calculator 类引用了一个 ImmutableValue 对象,请注意它可以通过 setImmutableValue() 方法和 add() 方法改变了 ImmutableValue 对象的引用。换句话说,即使 ImmutableValue 对象是不可变的,但它也是非线程安全的。ImmutableValue 类是线程安全的,但对象的引用是非线程安全的。所以特别注意:对象的引用可能是非线程安全的。 可以通过给 setImmutableValue() 方法和 add() 方法加锁(使用 synchronized 关键字等)保证线程安全。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值