java - 在java中,volatile和synchronized

  显示原文与译文双语对照的内容
0 0

我想知道在JAVA中访问该变量为 synchronized(this) 块中声明一个变量作为 volatile,总是( 特别是 J2ME ) 区别

根据本文的http://www.javamex.com/tutorials/synchronization_volatile.shtml,有很多需要说的,还有许多不同之处。

我对这一段信息特别感兴趣:

  • 对volatile变量的访问没有可能阻止: 我们只做一个简单的读或者写操作,所以不像同步的块,我们永远不会抓住任何锁;
  • 因为访问一个易失性变量从未持有锁定时,它是不适合的情况下,其中我们要 read-update-write 以原子操作的形式( 除非我们准备好"错过一个更新") ;

read-update-write 是什么意思? 还在写信info,不读上一个更新或者它所依赖的只是意味着更新是一个写怎样?

最重要的是,什么时候更适合声明变量 volatile 而不是通过 synchronized 访问它们? 使用 volatile 作为依赖于输入的变量是一个好主意? 例如有一个名为 render的变量通过呈现循环读取并由keypress事件设置?

时间: 原作者:

0 0

挥发性字段时,基,同时修改 同步代码块和方法。 因此我们可以使用这两个关键字来指定一个简单访问器的三种变体:


 int i1;
 int geti1() {return i1;}

 volatile int i2;
 int geti2() {return i2;}

 int i3;
 synchronized int geti3() {return i3;}

geti1() 访问当前线程中当前存储在 i1 中的值。 线程可以有局部变量的本地副本,而数据不必与其他 threads.In 中保持的数据相同,另一个线程可能有更新的i1,但当前线程中的值可能与更新的值不同。 事实上,Java有一个"主要"内存的概念,它是保存变量当前"正确"值的内存。 线程可以有自己的变量的数据副本,并且线程副本可以与"主要"内存不同。 所以实际上,就有可能为"主要"内存,将值设置为 1 为 i1,对于 thread1,将值设置为 2i1 和用于 thread2,将值设置为 3 为 i1 如果 thread1thread2而生成同时拥有更新,但这些更新后的值现在还没有传播到"主要"内存或者其它线程。

在"主要"memory,另一方面,geti2() 有效地访问的值 volatile变量不允许具有与当前"主要"内存中的值不同的变量的本地副本。 有效地,声明为volatile的变量必须在所有线程之间同步它,这样在任何线程中访问或者更新变量时,所有其他线程立即看到相同的值。 通常volatile变量具有比"plain"变量更高的访问和更新开销。 通常允许线程拥有自己的数据副本以提高效率。

volitile与synchronized有两个区别。

首先同步获取和释放监视器上的锁,这些监视器只能强制一次执行一个线程来执行代码块。 这是对同步的相当熟悉的方面。 但是同步也同步了内存。 实际上同步同步了整个线程内存和"主要"内存。 执行 geti3() 执行以下操作:

  1. 线程为对象获取监视器的锁。
  2. 线程内存刷新它所有的变量,换句话说,拥有从"主要"内存有效读取的所有变量。
  3. 代码块被执行( 在本例中,将返回值设置为i3的当前值,它可能已经被重新设置为"主"内存) 。
  4. ( 对变量的任何更改现在通常会写出到"主要"内存中,但对于 geti3(),我们没有任何更改。)
  5. 线程释放监视器上的锁,以便。

因此,volatile只同步线程内存和"主要"内存之间的一个变量的值,同步同步线程内存和"主要"内存之间的所有变量的值,并锁定并释放监视器来启动一个监视器。 明显同步可能会比volatile有更多的开销。

http://javaexp.blogspot.com/2007/12/difference-between-volatile-and.html

原作者:
...