问题标签 [atomicreference]

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 投票
2 回答
1175 浏览

java - 原子参考

根据文档,我对 AtomicReference.compareAndSet() 方法有一些疑问,它说:

如果当前值 == 预期值,则自动将值设置为给定的更新值。

据我了解,==运算符正在比较两个对象的地址,如果是这样,它将如何在这样的示例中工作

在这段代码片段中,jvm 如何知道AccessStatistics要在compareAndSet()? 事实上,我只是想知道这整个策略是如何工作的,因为 java 根本不允许覆盖==?感谢您的任何评论!

0 投票
2 回答
243 浏览

java - 限制对字段的并发访问

因此,在我正在编写的程序中,我使用双向广度优先搜索来搜索图形。为此,我在 1 个线程中运行 1 个广度优先搜索,然后在另一个线程中运行一个。现在,当另一个搜索中的一个元素被命中或找到目标时(这从未真正发生过,但以防万一它出于某种原因......),就说搜索找到了最佳解决方案。

我遇到的问题是,我需要将此最佳解决方案保存到一个字段中,因为我需要继续找到所有解决方案,但是由于两个线程同时命中它,该字段值变得混乱(我认为)。

有没有办法阻止对最后到达那里的线程的访问?我尝试过使用 AtomicReference 及其 compareAndSet 方法,但这并没有成功。价值仍然被搞砸了......

顺便说一句,我使用的是 java,而对于线程,我使用的是 Callable 对象。

0 投票
1 回答
936 浏览

java - java - 在线程之间共享数据 - 原子引用或同步

我正在制作一个 2 人视频游戏,并且对手的位置在线程上得到更新,因为它有一个持续监听的套接字。我想分享的是位置和旋转。

因为它是一个视频游戏,我不希望主线程被阻塞(或者只是可能的最短时间),我不希望性能受到影响。因此,从我所看到的分享这些信息来看,正常的做法是

但这会阻塞主线程中的读取(与绘制视频游戏相同),直到写入三个值(或者将来写入更多信息),而且我读过同步非常昂贵(也是重要的是要说这个游戏也适用于android,所以性能非常重要)。

但我在想,也许在 AtomicReference 中包含 sharedInfo 并消除 synchronized 会使其更有效,因为它只会在引用本身被更新时停止(写入不存在,我会创建一个新对象并将其放在atomicreference),他们还说 atomic* 使用硬件操作并且比同步更有效。

你怎么看?

0 投票
1 回答
1081 浏览

multithreading - 为什么 boost::shared_ptr 在它不是线程安全的时候会打扰原子引用计数?

这更像是一个好奇的问题,但由于 boost::shared_ptr 不是线程安全的,为什么还要使用原子引用计数呢?由于析构函数不能安全地跨线程使用,我没有看到这一点。

例如,如果您将 shared_ptr 的副本传递给线程,它总是会破坏,至少在线程最迟结束时是这样。

0 投票
2 回答
10375 浏览

java - 可以以线程安全的方式安全地递增 BigInteger,也许使用 AtomicReference,没有锁定?

我们的很多代码都是遗留的,但我们正在转向“大数据”后端,我正在尝试宣传更新的 API 调用,鼓励使用最新的 Spring 库等。我们的问题之一是应用层 ID一代。由于我不明白的原因,更高的权威想要顺序的 BigInteger。我会通过重新生成并重新尝试失败的插入来使它们随机化,但我确实被否决了。

撇开抱怨不谈,我现在需要跨线程递增并获取 BigInteger 并以安全和高性能的方式进行操作。我以前从未使用过 AtomicReference,但它看起来非常适合这个应用程序。现在我们有一个同步的代码块,它严重地损害了我们的性能。

这是正确的方法吗?语法示例?

我应该提到这个模块的工作方式,它使用存储过程访问数据库以获取要使用的值范围。一次数以万计,因此它可能仅在 20 分钟内发生一次。这可以防止各种服务器互相踩踏,但也增加了必须将 BigInteger 设置为任意后续值的麻烦。当然,这也需要是线程安全的。

PS我仍然认为我的随机生成想法比处理所有这些线程的东西要好。BigInteger 是一个大得离谱的数字,两次生成同一个数字的几率必须接近于零。

0 投票
1 回答
2694 浏览

gcc - GCC atomic builtins 和 volatile

我在多线程程序中使用了一些全局结构,一些成员被多个线程同时修改,而另一些则不是。

我没有定义任何 volatile 成员,但无论何时我将此成员用于读写目的,我都会使用原子内置函数,例如 __sync_fetch_and_add。

问题是,我应该定义这个成员还是整个 struct volatile?

我认为编译器必须访问内存而不是任何寄存器,因为这个内置函数(锁定前缀),我是否应该担心其他不会导致竞争条件的成员。

我检查了我的编译器(gcc 4.6.2)的汇编输出,看来我的假设是正确的。

这是测试代码。

汇编输出(-O2 -S -masm=intel)

所以编译器永远不会访问内存(eax = i,edx = sum)

这是第二个测试代码。

汇编输出

编译器每次都按预期访问内存求和。

最终代码,我的方式。

程序集输出。

甚至没有像以前(edx)那样的临时寄存器,编译器每次都访问内存。

因此,我不定义 volatile 任何由多个线程修改或一次仅由一个线程修改的成员。我安全吗?

提前致谢。

0 投票
4 回答
3783 浏览

java - AtomicReference 和有什么区别与 AtomicInteger 对比?

我不明白这两者之间的区别:

对比

有人可以说什么时候使用 AtomicReference 吗?希望可以有人帮帮我。谢谢。

0 投票
4 回答
860 浏览

java - 请解释最终的 AtomicReference

有人可以解释一下吗:

final 在什么意义上使用?

0 投票
2 回答
1014 浏览

java - 对 volatile、syncronized 和 AtomicReference 等概念的正确理解?

我想确保我正确理解了这些概念。解释/确认将对我有很大帮助,我相信许多其他程序员。以下是我对这些概念的理解,来自我的调查:

  1. 当你想在多个线程之间共享一个变量时使用易失性。a) 声明一个(线程间共享的)变量 volatile 和 not 有什么区别?b) 我们是否应该总是在从不同线程访问它时声明它是 volatile 的?c) 同步 volatile 变量是否有意义?

  2. AtomicReference 是一个包装我们的对象并提供一些原子操作的类(compareAndSet、lazySet 和weakCompareAndSet)。这就是全部,没有同步,什么都没有。a) 声明一个 AtomicReference volatile 有意义吗?b)但是同步呢?,因为 AtomicReference.get 既不同步也不同步?

  3. 同步是一个概念,它意味着对多个线程之间共享的变量的顺序访问。它可以通过实例和类来完成。同步可以添加到方法头或代码块中。我希望这里没有谜团:)

问候, 奥勒良

0 投票
2 回答
2360 浏览

java - Java中的无锁和大小限制队列

根据这篇文章,我正在尝试在 Java 中扩展无锁队列的实现。

对于我的实现,我仅限于使用原子变量/引用。另外是我的队列应该有一个最大大小。因此,当队列已满时,putObject() 应该阻塞,如果队列为空,则 getObject() 应该阻塞。

目前我不知道如何在不使用锁的情况下解决这个问题。

例如,当使用 AtomicInteger 时,修改操作将是原子的。但是仍然存在我必须在 putObject() 和 getObject() 中处理检查和修改情况的问题,对吗?所以仍然存在检查当前队列大小后会中断入队线程的情况。

我目前的问题是,这个问题是否可以根据我目前的限制解决?

问候