在线程之间共享对象的类成员中,是否有不使用易失性的场景?我的理解是易失性关键字确保对象值不被线程缓存,而是总是从内存中读取,但不标记它易失性并不意味着它总是被线程缓存。所以我的问题是,我们能不能保证不标记这样一个类是易失性的,或者代码会对随机行为开放吗?
编辑:我明白,使用易失性并不能保证我的逻辑的正确性。我的问题更多是一个理论性质的问题,是我试图理解Java内存模型的问题。
发布于 2014-11-20 14:20:58
首先,您不应该用缓存来解释并发性。因为第2版的java内存模型更正式,需求也更弱。所以,一切都是发生在秩序之前。
如果您需要并发访问某个变量,则必须在发生之前对写入和读取进行排序。这是最重要的东西。易失性只是这种排序的实现之一。
因此,与易失性操作不同,您可以在语义之前使用发生的任何操作。来自JLS
发布于 2014-11-19 14:11:16
至少不可变对象不需要任何类型的同步。因此,对不可变类的字段使用volatile是没有意义的。
发布于 2014-11-19 14:10:06
如果您不将变量声明为易失性变量,并且在访问变量之前不执行任何类型的互斥锁,那么是的,您总是将自己暴露在不可预测的行为和竞争条件/死锁中。
https://stackoverflow.com/questions/27027974
复制相似问题