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

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

如前所述

Java语言还提供了另一种更弱的同步形式,即可变变量,以确保变量的更新可预测地传播到其他线程

所以我的理解是,

下面的代码使用锁定(
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();
    }