问题标签 [volatile]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
1927 浏览

java - volatile关键字似乎没用?

每个都Thread进入 run 方法并int通过i从被AtomicInteger调用的count. 然后每个Thread等待被CountDownLatch调用cdl1(当最后一个Thread到达闩锁时,所有Threads都被释放)。当闩锁被释放时,每个线程都会尝试将它们的受限i值分配给共享的volatile,int称为bar

我希望Thread除一个之外的每个都打印出“Bar not equal to i”,但每个Thread打印出“Bar equal to i”。呃,volatile如果不是这个,wtf 确实会这样做?

这是一个故意的意图,每个Thread尝试bar在完全相同的时间设置值。

编辑:

根据答案,将代码更改为:

确保在变量的设置和读取之间浪费一点时间。

现在,Bar 的相同/不同值的打印是 50/50。

0 投票
1 回答
824 浏览

.net - 有没有更简单的方法在 .net 中创建注册表易失性子项?

到目前为止,我有以下内容摘自

http://www.danielmoth.com/Blog/volatile-registrykey.aspx

哪个有效,但相当丑陋。有没有更好的办法?

0 投票
1 回答
8142 浏览

c# - 不同的线程访问 MemoryStream

有一些代码通过调用 GetBuffer() 将数据直接写入 MemoryStream 对象的数据缓冲区。它还适当地使用和更新 Position 和 SetLength() 属性。

此代码在 99.9999% 的时间内都能正常工作。字面上地。只有每这么多 100,000 次迭代它才会呕吐。具体问题是 MemoryStream 的 Position 属性突然返回零而不是适当的值。

但是,添加了检查 0 并引发异常的代码,该异常在单独的方法中包含 MemoryStream 属性(如 Position 和 Length)的日志。那些返回正确的值。在同一方法中进一步添加日志记录表明,当这种罕见情况发生时,位置在此特定方法内仅为零。

好的。显然,这一定是线程问题。并且很可能是编译器优化问题。

然而,这个软件的本质是它是由带有调度程序的“任务”组织的,因此几个实际的 O/S 线程中的任何一个都可以在任何给定时间运行这个代码——但一次不能超过一个。

所以我的猜测是,通常情况下,同一个线程一直被用于此方法,然后在极少数情况下使用不同的线程。(只需编写代码来通过捕获和比较线程 ID 来测试这个理论。)

然后由于编译器优化,不同的线程永远不会得到正确的值。它得到一个“陈旧”的价值。

通常在这种情况下,我会将“volatile”关键字应用于相关变量,以查看是否可以修复它。但在这种情况下,变量位于 MemoryStream 对象内。

有没有人有其他想法?或者这是否意味着我们必须实现自己的 MemoryStream 对象?

真诚的,韦恩

编辑:刚刚运行了一个测试,该测试计算对该方法的调用总数,并计算 ManagedThreadId 与上次调用不同的次数。它几乎恰好有 50% 的时间切换线程——在它们之间交替。所以我上面的理论几乎肯定是错误的,或者错误会更频繁地发生。

编辑:这个错误发生得非常少,以至于在没有这个错误的情况下需要将近一周的时间才能感觉到它真的消失了。相反,最好进行实验以准确确认问题的性质。

编辑:当前锁定是通过使用 MemoryStream 的 5 个方法中的每个方法中的 lock() 语句处理的。

0 投票
4 回答
528 浏览

java - 这个变量需要声明为 volatile 吗?

MyThread 类中的变量是否out需要在此代码中声明为 volatile,或者stdoutThreadTest 类中变量的“波动性”是否会延续?

0 投票
3 回答
3938 浏览

java - Java并发:“级联”变量中的易失性与最终性?

一样

如果内部地图被不同的线程访问?

或者甚至需要这样的东西:

如果它不是“级联”映射,最终和 volatile 最终具有相同的效果,即所有线程始终看到映射的正确内容......但是如果映射本身包含映射会发生什么,如示例中所示...如何确保内部 Map 正确“内存屏障”?

坦克!汤姆

0 投票
6 回答
988 浏览

java - 如何在 Java 中正确使用 volatile 关键字?

假设我有两个线程和一个对象。一个线程分配对象:

另一个线程使用该对象:

变量 myObject 是否必须声明为 volatile?我试图了解何时使用 volatile 何时不使用,这让我感到困惑。第二个线程是否有可能在其本地内存缓存中保留对旧对象的引用?如果不是,为什么不呢?

非常感谢。

0 投票
2 回答
1525 浏览

c++ - 严格的指针别名:通过“易失性”指针/引用访问是一种解决方案吗?

特定问题、自我回答和评论之后,我想了解它是否是正确的解决方案、解决方法/黑客或完全错误。

具体来说,我重写了代码:

作为:

带有volatile指针的限定符。

让我们假设在我的情况下对待Tint有道理的。这种通过volatile引用访问是否解决了指针别名问题?

作为参考,来自规范:

[注意: volatile 是对实现的提示,以避免涉及对象的激进优化,因为对象的值可能会通过实现无法检测到的方式进行更改。详细语义见 1.9。一般来说,volatile 的语义在 C++ 中与在 C 中的语义相同。 — 尾注]

编辑:

上面的代码至少在 GCC 4.5 上确实解决了我的问题。

0 投票
4 回答
761 浏览

java - 正确使用 volatile 关键字

我认为我对 java 中的关键字有一个很好的想法volatile,但我正在考虑重构一些代码,我认为使用它是一个好主意。

我有一个基本上用作数据库缓存的类。它拥有一堆从数据库中读取的对象,为这些对象提供请求,然后偶尔刷新数据库(基于超时)。这是骨架

所以担心 loadMappingsFromDB 可能是一个高延迟操作,这是不可接受的,所以最初我认为我可以在缓存启动时启动一个线程,然后让它休眠,然后在后台更新缓存。但后来我需要同步我的班级(或地图)。然后我只是为了让每个缓存访问变慢而偶尔暂停一下。

然后我想为什么不使用volatile

我可以将地图参考定义为 volatile

然后在get(或使用映射变量的任何其他地方)我将只制作引用的本地副本:

然后后台线程将加载到临时表中,然后交换类中的引用

这种方法有意义吗?它实际上是线程安全的吗?

0 投票
2 回答
4048 浏览

c++ - volatile 上的 const_cast<> 的目的是什么?

我看到有可能做到,但我不明白这种兴趣。

0 投票
3 回答
16819 浏览

java - 使用 volatile long 有什么意义吗?

volatile在我有两个线程读取/写入它并且不希望取出锁的开销(或潜在的死锁风险)的情况下,我偶尔会使用实例变量;例如,一个计时器线程定期更新一个 int ID,该 ID 作为某个类的 getter 公开:

我的问题:鉴于 JLS 只保证 32 位读取是原子的,那么使用 volatile long 有什么意义?(即 64 位)。

警告:请不要回复说使用volatileoversynchronized是预优化的情况;我很清楚如何/何时使用synchronized,但在某些情况下volatile更可取。例如,在定义用于单线程应用程序的 Spring bean 时,我倾向于使用volatile实例变量,因为不能保证 Spring 上下文会在主线程中初始化每个 bean 的属性。