为什么volatile是较弱的同步形式?

时间:2017-10-08 20:03:00

标签: java multithreading synchronization

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; }
}

但是,

  1. 为什么volatile使用较弱的同步形式?

  2. 预订说:撰写volatile变量就像退出synchronized块一样,阅读volatile变量就像输入synchronized块< / em>的

    多个线程可以写入volatile内存区域value,是否可以互斥?

2 个答案:

答案 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访问修饰符时不涉及锁定。

相关文章:

Difference between volatile and synchronized in Java