Java 为什么volatile是较弱的同步形式?
如前所述 Java语言还提供了另一种更弱的同步形式,即可变变量,以确保变量的更新可预测地传播到其他线程 所以我的理解是, 下面的代码使用锁定(Java 为什么volatile是较弱的同步形式?,java,multithreading,synchronization,Java,Multithreading,Synchronization,如前所述 Java语言还提供了另一种更弱的同步形式,即可变变量,以确保变量的更新可预测地传播到其他线程 所以我的理解是, 下面的代码使用锁定(synchronized)提供(互斥+内存可见性) 也可以使用volatile关键字提供(互斥+内存可见性)编写,如下所示 public class SynchronizedInteger{ private volatile int value; public int get(){ return value; } public v
synchronized
)提供(互斥+内存可见性)
也可以使用volatile
关键字提供(互斥+内存可见性)编写,如下所示
public class SynchronizedInteger{
private volatile int value;
public int get(){ return value; }
public void set(int value){ this.value = value; }
}
但是,
volatile
用法是比较弱的同步形式
volatile
变量就像退出synchronized
块,而读取volatile
变量就像进入synchronized
块
向易失性内存区值写入的多个线程是否可以保持互斥
volatile
无法在其他实体上创建关键部分,而synchronized
可以
e、 g
使用volatile
,您只能“保护”被设置为volatile的实体
关于 多线程能否写入易失性内存区域值,保持互斥 否。该实体上的每个读/写操作都是原子的。请记住,像
value++
这样的操作由读和写组成,需要单独处理。volatile是变量访问修饰符,它强制所有线程从主存获取变量的最新值。访问易失性变量不需要锁定
synchronized是方法级/块级访问限制修改器。它将确保一个线程拥有关键部分的锁。只有拥有锁的线程才能进入synchronized
block。如果其他线程试图访问此关键部分,则必须等待当前所有者释放锁。在synchronized
块/方法中可以有许多语句
为什么易失性使用是较弱的同步形式
如果一个线程修改变量的值,而其他线程读取该变量的值,那么向变量添加volatile
access修饰符是有意义的。如果多个线程正在修改和读取变量的值,volatile
access修饰符不能保证数据的一致性。但如果同步更新/读取代码块,则可以保证数据的一致性
多线程能否写入易失性内存区域值,保持互斥
否。因为使用volatile
访问修饰符时不涉及锁定
相关职位:
你的意思是复合动作可以处理
同步而不像volatile
或AtomicLong
那样。那么,在不处理超过它所能处理的东西方面,复合动作就更弱了?正如我在前面的评论中提到的?@overexchange是的,通常需要使用不同的机制(例如,同步
)来实现目标。您不能对volatile执行多个操作,只有简单的读取或写入是原子的。这意味着即使增量也不是原子的,因为它是一个读操作和一个写操作。你从哪里得到了volatile
提供互斥的想法?@shmosel我对volatile
提供互斥的理解是因为,写入volatile
变量就像退出synchronized
块,而读取volatile
变量就像进入synchronized
块,目前还不清楚它的含义。我在queryThey有这个,它们有相同的原子性和可见性保证。与volatile
@shmosel没有互斥的概念,但原子性涉及哪些动作和动作集具有不可分割的效果。这是程序员最熟悉的并发方面:它通常被认为是互斥的。原子性/互斥性的含义不一样吗?在这种情况下不一样。互斥是实现原子性的几种方法之一。
public class SynchronizedInteger{
private volatile int value;
public int get(){ return value; }
public void set(int value){ this.value = value; }
}
synchronized (something) {
something.doSomething();
somethingElse.doSomethingElse();
}