如Java_author所述,
Java语言还提供了另一种较弱的同步形式 volatile variables ,以确保对变量的更新可预测地传播到其他线程。
所以,我的理解是,
以下代码使用锁定(synchronized
)来提供(互斥+内存可见性),
public class SynchronizedInteger{
private int value;
public synchronized int get(){ return value; }
public synchronized void set(int value){ this.value = value; }
}
也可以使用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
块< / em>的
多个线程可以写入volatile
内存区域value
,是否可以互斥?
答案 0 :(得分:1)
volatile
无法在其他实体上创建关键部分,synchronized
可以。
e.g。
synchronized (something) {
something.doSomething();
somethingElse.doSomethingElse();
}
使用volatile
,您只能“保护”变为易失的实体。
关于
多个线程可以写入易失性存储区域值,保持互斥吗?
没有。该实体上的每个读/写操作都是原子的。请记住,像value++
这样的操作由读写组成,需要单独处理。
答案 1 :(得分:0)
volatile 是变量访问修饰符,它强制所有线程从主内存中获取变量的最新值。访问volatile变量不需要锁定。
synchronized 是方法级/块级访问限制修饰符。它将确保一个线程拥有临界区的锁。只有拥有锁的线程才能进入synchronized
块。如果其他线程正在尝试访问此关键部分,则必须等到当前所有者释放锁定。您可以在synchronized
块/方法中包含许多语句。
为什么volatile的使用是较弱的同步形式?
如果一个线程修改变量的值而其他线程读取该变量的值,则向变量添加volatile
访问修饰符是有意义的。如果多个线程正在修改并读取变量值,volatile
访问修饰符不保证数据一致性。但是,如果您同步更新/读取代码块,则可以保证数据的一致性。
多个线程可以写入易失性存储区域值,保持互斥吗?
没有。由于使用volatile
访问修饰符时不涉及锁定。
相关文章: