请问老师,关于volatile,什么叫“该变量没有包含在具有其他变量的不变的式子中”?

来源:3-4 线程安全性-可见性

磊磊要酷酷滴

2019-03-27

  • “具有其他变量的不变的式子中”是什么意思啊,老师能举个栗子吗?
写回答

1回答

Jimin

2019-03-27

你好,看这么一个例子:

public class NumberRange {

private int lower, upper;
public int getLower() { return lower; }
public int getUpper() { return upper; }

public void setLower(int value) { 
if (value > upper) 
throw new IllegalArgumentException(...);
lower = value;
}

public void setUpper(int value) { 
if (value < lower) 
throw new IllegalArgumentException(...);
upper = value;
}
}

这种方式限制了范围的状态变量,因此将 lower 和 upper 字段定义为 volatile 类型不能够充分实现类的线程安全;从而仍然需要使用同步。否则,如果凑巧两个线程在同一时间使用不一致的值执行 setLower 和 setUpper 的话,则会使范围处于不一致的状态。例如,如果初始状态是(0, 5),同一时间内,线程 A 调用 setLower(4) 并且线程 B 调用 setUpper(3),显然这两个操作交叉存入的值是不符合条件的,那么两个线程都会通过用于保护不变式的检查,使得最后的范围值是 (4, 3) —— 一个无效值。至于针对范围的其他操作,我们需要使 setLower()和 setUpper() 操作原子化 —— 而将字段定义为 volatile 类型是无法实现这一目的的。
1
0

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程