线程安全和不变性
来源:互联网 发布:c语言 表达式的值 编辑:程序博客网 时间:2024/05/21 22:39
竞争条件只有在多个线程正在访问同一资源且一个或多个线程写入资源时才会发生。如果多线程读取相同的资源竞争条件是不会发生的。
我们可以确保线程之间共享的对象永远不会被任何线程更新,那就是让共享对象不可变,从而线程安全。以下一个例子:
public class ImmutableValue{ private int value = 0; public ImmutableValue(int value){ this.value = value; } public int getValue(){ return this.value; }}
注意在构造函数中如何传递ImmutableValue实例的值。还要注意类里面没有setter方法。一旦创建了一个ImmutableValue实例,您将无法更改其值。这是不可变的。然而可以使用getValue()方法读取它。
如果需要对ImmutableValue实例执行操作,可以通过从操作得到的值返回一个新的实例来执行此操作。以下是添加操作的示例:
public class ImmutableValue{ private int value = 0; public ImmutableValue(int value){ this.value = value; } public int getValue(){ return this.value; } public ImmutableValue add(int valueToAdd){ return new ImmutableValue(this.value + valueToAdd); }}
注意add()方法如何返回一个新的具有添加操作结果的ImmutableValue实例,而不是将值添加到自身。
引用不是线程安全的
记住!即使一个对象是不可变的,从而线程也是安全的,对该对象的引用可能不是线程安全的,看下面这个例子:
public class Calculator{ private ImmutableValue currentValue = null; public ImmutableValue getValue(){ return currentValue; } public void setValue(ImmutableValue newValue){ this.currentValue = newValue; } public void add(int newValue){ this.currentValue = this.currentValue.add(newValue); }}
Calculator类保存对ImmutableValue实例的引用。注意可以通过setValue()和add()方法来更改引用。因此,即使Calculator类在内部使用不可变对象,它本身也不可变,但也不是线程安全的。换句话说:ImmutableValue类是线程安全的,但使用它的不是。当尝试通过不变性实现线程安全性时,这是要记住的。
为了使计算器类线程安全,您可以声明getValue(),setValue()和add()方法synchronized。那会做到这一点。
阅读全文
1 0
- 线程安全和不变性
- 线程安全中的不变性(Invariant)
- 不变性和可变性
- pooling和旋转不变性
- Java 并发编程(二)对象的不变性和安全的发布对象
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- 线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- 线程安全和非线程安全
- 最全Pycharm教程(1)——定制外观
- Android 开源框架之 Android-async-http 源码解读
- HDU 5698 瞬间移动【组合数+逆元】
- OceanBase:新一代面向金融的分布式关系数据库
- 【代码笔记】iOS-NSSearchPathForDirectoriesInDomainsDemo
- 线程安全和不变性
- 更改mysql端口
- 最全Pycharm教程(2)——代码风格
- java SimpleDateFormat类介绍
- download chromedriver from mirror website
- Android图片处理总结四:双击图片,保持点击位置不变放大
- Java实现2048
- [一天一项目] 获取m个数中和等与k的n个数
- java用递归算法求1~100的和