【问题标题】:difference between the keywords volatile and syncronized [duplicate]关键字volatile和syncronized之间的区别[重复]
【发布时间】:2014-08-14 19:25:40
【问题描述】:

在什么情况下 volatile 可以代替 synchronized?另外,double 和 long 上的写操作如何在声明为 volatile 后变成原子操作

【问题讨论】:

  • s/volatile/synchronized 或 s/synchronized/volatile 总是会导致编译错误...volatile { ... }? public synchronized String s;?
  • 这两者都与多线程代码隐约相关。在询问他们的“差异”之前,您应该了解他们每个人是什么。这就像问安全带和护理人员之间的区别。

标签: java


【解决方案1】:

无!

volatile 主要用于变量, synchronized 主要用于方法/块。

Volatile 关键字用于确保在多线程环境中跨线程的可见性。如果变量不是易失性的,则两个不同的线程可能有两个不同的本地副本。使其易变确保相同的值反映在所有线程中。

同步用于方法/块。这些方法或块是关键区域,其监视器需要在访问之前锁定。每个对象都有一个关联的监视器。只要一个线程拥有一个监视器,其他线程就不能访问由该监视器管理的关键区域。

【讨论】:

  • volatile 只保证可见性(和排序) - synchronized 也保证原子性。
  • synchronized 用于同步块。
  • 是的,只是在打字。
【解决方案2】:

java中volatile和synchronized的区别

  • 同步修改代码块和方法,其中为易失性 关键字用作带变量的修饰符。

  • 在Java中,volatile关键字只同步一个变量的值 同步关键字时线程内存和主内存之间 在线程内存和主线程之间同步所有变量的值 记忆

  • volatile 与 synchronized 相比工作得更快,因为 synchronized 由于获取和释放锁,对性能有很大影响。

  • volatile 不需要获取和释放锁,但它是 同步所必需的。

difference-between-volatile-and- synchronize阅读一篇非常好的文章。

为了清楚起见,在这里解释一下 -

      int i1;              int geti1() {return i1;}
volatile int i2;              int geti2() {return i2;}
        int i3; synchronized int geti3() {return i3;}

geti1() 在当前线程中访问当前存储在 i1 中的值。线程可以有变量的本地副本,并且数据不必与其他线程中保存的数据相同。特别是,另一个线程可能在其线程中更新了 i1,但当前线程中的值可能与更新后的值不同。事实上,Java 有“主”内存的概念,这是保存变量当前“正确”值的内存。线程可以拥有自己的变量数据副本,并且线程副本可以不同于“主”内存。因此,事实上,如果 thread1 和 thread2 都已更新,则“主”内存可能对 i1 具有值 1,对于 thread1 对于 i1 具有值 2,对于 thread2 对于 i1 具有值 3 i1 但这些更新的值尚未传播到“主”内存或其他线程。

另一方面,geti2() 有效地从“主”内存访问 i2 的值。不允许 volatile 变量具有与“主”内存中当前保存的值不同的变量的本地副本。实际上,声明为 volatile 的变量必须在所有线程中同步其数据,这样每当您在任何线程中访问或更新变量时,所有其他线程都会立即看到相同的值。通常 volatile 变量比“普通”变量具有更高的访问和更新开销。通常允许线程拥有自己的数据副本是为了提高效率。

执行 geti3() 执行以下操作:

  • 线程获取对象 this 的监视器上的锁。
  • 线程内存刷新它的所有变量,即它拥有它的所有变量 变量有效地从“主”内存中读取。
  • 代码块被执行(在这种情况下将返回值设置为 i3 的当前值,可能刚刚从“main”重置 记忆)。
  • (对变量的任何更改现在通常都会写入“main” 内存,但对于 geti3() 我们没有任何变化。)
  • 线程释放对象 this 的监视器上的锁。

所以其中 volatile 只在线程内存和“主”内存之间同步一个变量的值,synchronized 在线程内存和“主”内存之间同步所有变量的值,并锁定和释放一个监视器以启动。显然同步的开销可能比 volatile 的开销更大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2021-09-07
    • 2014-08-16
    相关资源
    最近更新 更多