Java 易失变量、多线程

标签 java multithreading

我有一个多线程应用程序。我注意到当变量由多个线程共享时,某些现有代码使用 volatile。为什么在使用变量的时候不直接在方法中使用synchronized呢?将变量定义为volatile有什么好处?

最佳答案

声明一个 volatile Java 变量意味着:

  • 该变量的值永远不会在线程本地缓存:所有读取和写入都将直接进入“主内存”;
  • 对变量的访问就像将其包含在同步块(synchronized block)中一样,并对其自身进行同步。

换句话来说,synchronized 和 volatile 之间的主要区别是:

  • 原始变量可以声明为 volatile(而您无法使用synchronized 对原始变量进行同步);
  • 对 volatile 变量的访问永远不会被阻塞:我们只进行简单的读取或写入,因此与同步块(synchronized block)不同,我们永远不会持有任何锁;
  • 因为访问 volatile 变量永远不会持有锁,所以它不适合我们希望将读取-更新-写入作为原子操作的情况(除非我们准备“错过更新”);
  • 作为对象引用的 volatile 变量可能为 null(因为您实际上是在引用上同步,而不是在实际对象上同步)。

更多信息是:http://javamex.com/tutorials/synchronization_volatile.shtml

关于Java 易失变量、多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9275298/

相关文章:

java - 在android中膨胀类ImageView时出错

java - 引用分配是原子的,所以为什么要使用 AtomicReference

java - java连接两个线程

ios - 后台线程方法无法解决卡住问题

java - 对于线程脚本,在 Groovy 中使用同步 println 和仅使用 println 有什么区别?

multithreading - 使用 libev 的多线程套接字服务器

java - 如何在同一个jframe中管理多个面板?

使用 FileWriter 的 java.lang.NullPointEreException

java - 可以使用复合键制作 spring-data-elasticsearch @Document 吗?

java - 如何使用 Vaadin 将图像上传到 Canvas ?