- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我对我读到的关于 volatile 关键字在 java 中的应用的内容感到非常困惑。
下列说法正确吗?“对 volatile 字段的写入发生在每次后续读取同一字段之前”
理想情况下应该在什么时候使用 volatile 关键字?
有什么区别:
class TestClass
{ private int x;
synchronized int get(){return x;}
synchronized void set(int x){this.x = x;}
}
和
class TestClass
{ private volatile int x;
int get(){return x;}
void set(int x){this.x = x;}
}
最佳答案
volatile是字段修饰符,而synchronized修饰代码块和方法。因此,我们可以使用这两个关键字指定简单访问器的三种变体:
int i1;
int geti1() {return i1;}
volatile int i2;
int geti2() {return i2;}
int i3;
synchronized int geti3() {return i3;}
geti1()
在当前线程中访问当前存储在 i1
中的值。线程可以有变量的本地副本,并且数据不必与其他线程中保存的数据相同。特别是,另一个线程可能已经更新了它的线程中的i1
,但是其中的值当前线程可能与更新后的值不同。事实上,Java 有“主”内存的概念,这是保存变量当前“正确”值的内存。线程可以拥有自己的变量数据副本,并且线程副本可以不同于“主”内存。所以事实上,对于 i1
,“主”内存的值可能为 1,线程 1 的值可能为 2 对于 i1
和对于 thread2 如果 thread1 对于 i1
的值为 3> 和 thread2 都更新了 i1,但这些更新的值尚未传播到“主”内存或其他线程。
另一方面,geti2()
有效地从“主”内存中访问 i2
的值。不允许 volatile 变量具有与“主”内存中当前保存的值不同的变量的本地副本。实际上,声明为 volatile 的变量必须在所有线程中同步其数据,这样每当您在任何线程中访问或更新变量时,所有其他线程都会立即看到相同的值。通常 volatile 变量比“普通”变量具有更高的访问和更新开销。通常允许线程拥有自己的数据副本是为了提高效率。
volitile 和 synchronized 有两个区别。
首先同步获取并释放监视器上的锁,该锁一次只能强制一个线程执行代码块。这是同步的众所周知的方面。但是 synchronized 也会同步内存。实际上 synchronized 将整个线程内存与“主”内存同步。所以执行 geti3()
会执行以下操作:
所以其中 volatile 只在线程内存和“主”内存之间同步一个变量的值,synchronized 在线程内存和“主”内存之间同步所有变量的值,并锁定和释放一个监视器以启动。显然,同步的开销可能比 volatile 的开销更大。
http://javaexp.blogspot.com/2007/12/difference-between-volatile-and.html
关于java - Java中的volatile关键字-澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3603157/
在此链接中:http://www.sencha.com/blog/spotlight-ext-js-customers/ 请滚动到部分:为什么我们选择 Ext JS 有这一行: By using Ex
只是想确保我正确理解这一点(我会在 SO Chat 上问,但它已经死在那里了!): 我们有一个顶点数组,我们通过绑定(bind)它使其成为“当前” 然后我们有一个缓冲区,我们将其绑定(bind)到目标
我正在学习与 Java Swing 一起使用的类(class),但我遇到了障碍。在这个项目中,我们正在为不同的组件设置大小,但是,导师特意敲了一行我不太理解的代码,我只是在寻找这行代码概念的解释。 基
所以我尝试创建一个 HttpsRequest,效果非常好。问题是,我做错了什么,我认为这可能是因为我使用 HttpResponse,但我没有找到任何与 Https 类似的东西。有没有一种方法可以像 h
我正在阅读 Martin Fowler 的“UML distilled”,在阅读关联类的过程中,我得到了这句话: What benefit do you gain with the associati
我只是询问此说明: String[][] s = new String[2][2]; 如果我创建这个变量“s”,我会创建一个包含 2 行和 2 列的字符串表吗?或者 2 个表有 2 个元素?感谢您的澄
我目前正在做的事情需要为世界各地的用户提供本地化时间。所有日期时间都存储为 UTC,因此转换它们非常容易,并且我们有一个已知的、安全的引用点等等。 但是,关于如何表达偏移量的一些事情让我摸不着头脑。
我开始学习 spring,我遇到了一个定义,它说“Spring 使开发人员能够在没有应用程序服务器的情况下进行企业开发”。 这到底是什么意思,使用应用服务器进行企业开发有什么危害。 但是开发者在进行企
我是 AngularJS 的新手,对如何设置 angularJS 进行开发感到困惑。 Link1 link1 说我们需要 node.js 和一系列其他工具,这些工具必须在使用 AngularJS 之前
我是 iPhone 和 iPad 应用程序的开发者。 我的一个应用程序是在线个人财务管理工具的配套应用程序,该工具通过网站提供其服务和功能。这些功能的一部分将通过我正在创建的原生 iOS 应用程序提供
我正在研究飞行模拟器。我读过一篇关于四元数的教程(这个:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quater
抱歉,如果这是一个微不足道的问题: 实现 1: class Foo { protected: int bar; public: Foo(int bar) {
作为 C 中实现定义行为的示例。C 标准规定数据类型的大小是实现定义的。因此,假设 sizeof(int) 是实现定义的。 此实现定义的行为是否意味着 size(int) 依赖于平台或由编译器供应商定
从理论上讲,inline 函数在 C 语言中具有内部/静态链接,也就是说,它们仅在单个翻译单元内可见。因此,在两个单独的文件中定义的内联函数应该无法相互看到,并且两者都有自己的地址空间。 我正在尝试使
对于神童来说,这可能是一个非常基本的问题。但我对处理它有疑问。 在转换期间我们使用: int.Parse(someThing) Convert.ToInt32 或 Convert.ToString()
这个问题在这里已经有了答案: Regarding Android Permissions and Signature Protection level (2 个答案) 关闭 8 年前。 由于我是An
我有这个功能: 函数 Foo(){} 根据这张图片: >> Foo.prototype -> Foo {} 所以如果我写: Foo.prototype.constructor 现在 - 它引
我读了this article关于 Task.ConfigureAwait,它有助于防止异步代码中的死锁。 看看这段代码:(我知道我不应该做 .Result ,但这是问题的一部分) private v
我正在学习 C#。我可以将闭包理解为一种可以适应其定义环境中的变化的结构吗。 示例: List gurus = new List() {
这个问题在这里已经有了答案: Difference between volatile and synchronized in Java (4 个回答) 关闭6年前。 我对我读到的关于 volatile
我是一名优秀的程序员,十分优秀!