volatile使用锁时是否需要修饰符来保证内存可见性?
试图完全理解并发性、内存可见性和执行控制我遇到了几个消息来源说在synchronized块中更新的变量不需要该字段volatile(大多数没有提供来源,实际上有一页说需要结合使用同步方法和波动性字段)。
当接近jls 第 17.4.5 章时,我发现:
两个动作可以通过happens-before 关系排序。如果一个动作发生在另一个之前,那么第一个动作对第二个动作可见并在第二个动作之前排序。
这部分是说后续同步方法调用保护相同的变量变量将确保它对第二个线程可见吗?如果是这种情况,锁也一样吗,因为我们也可以保证订单?
另一方面,当我们突然拥有允许 2 个线程访问该字段的写锁时会发生什么。即使在变量被解锁的情况下,整个构造是否会崩溃并且线程也永远不会保证更新它们的缓存?
简而言之
int field; //volatile not needed because we have a definite happens-before relationship
Lock lock;
void update(){
//No matter how many threads access this method they will always have
//the most up to date field value to work with.
lock.lock()
field *= 2;
lock.unlock();
}
胡子哥哥
互换的青春
相关分类