我对 2 个 java 关键字synchronized
和volatile
.
据我了解,由于 java 是一种multi-threaded
语言,并且通过使用关键字synchronized
将强制它在 1 个线程中执行。我对么 ?
并且volatile
也做同样的事情?
我对 2 个 java 关键字synchronized
和volatile
.
据我了解,由于 java 是一种multi-threaded
语言,并且通过使用关键字synchronized
将强制它在 1 个线程中执行。我对么 ?
并且volatile
也做同样的事情?
volatile 和 synchronized 都保证了可见性,但 synchronized 也提供了原子性:
forlong
和double
读写操作不是原子的。
volatile
是一个修饰符,您可以放在变量上以使读写操作原子化(包括long
and double
)
文章Atomic Access获得了有关它的更多信息。
基本上它是为了确保如果一个线程更改了变量的值,其余线程将看到该更改并且在写入时将无法读取它。
Java 多线程涉及两个问题,确保可以一致地完成多个操作,而不会混合不同线程的操作,以及使变量值的更改对执行更改以外的线程可用。
实际上,变量自然不会存在于硬件中的单个位置。不同线程的内部状态中可能存在副本,或者在不同的硬件缓存中。从执行分配的线程的角度来看,简单地分配给变量会自动更改其值。
如果变量被标记为“volatile”,其他线程将获得更改后的值。
“同步”还确保更改变得可见。具体来说,在同步块结束之前在一个线程中完成的任何更改对于在同一对象上同步的后续块中的另一个线程完成的读取都是可见的。
此外,在同一对象上同步的块被强制按顺序运行,而不是并行运行。这允许人们做一些事情,比如将一个变量加一,知道它的值在读取旧值和写入新值之间不会改变。它还允许对多个变量进行一致的更改。
我知道学习用 Java 编写可靠的并发代码所需的最佳方法是阅读Java Concurrency in Practice
本质上, volatile 用于指示变量的值将被不同的线程修改。
Synchronized 是一个关键字,其总体目的是一次只允许一个线程进入特定的代码部分,从而允许我们保护变量或数据不被来自不同线程的同时修改破坏。
它和Java 内存模型中描述的一样复杂。
同步意味着在给定时间只有一个线程可以访问方法或代码块。
Volatile 处理线程之间的通信。这是一个很好的解释:http: //jeremymanson.blogspot.be/2008/11/what-volatile-means-in-java.html
Volatile 关键字将使每个线程在内存位置中读取或写入作为原子操作。如果您不使用 volatile,则该变量可能会被线程缓存,并且线程可能正在读取/写入缓存副本而不是实际副本。