问题标签 [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 回答
831 浏览

c# - C#如何保护原子类的字段?

我正在尝试在 C# 中创建一个 AtomicReference 类,并且我想保护字段引用,但我还需要在 get 方法中返回值:

解决这个问题有点笨拙……我不能将字段设为只读,因为我需要能够设置它。有比我更好的解决方案吗?

更新:感谢您的快速回复!正确地指出,如果我简单地返回 _value,引用将受到保护。我还想保护 _value 免受变异。如果我允许 _value 在 AtomicReference 之外发生变异,那么它就违背了制作这个类的全部目的......有没有办法实现这一点?

0 投票
5 回答
2876 浏览

c# - Java中的AtomicReference - 在线程安全环境中设置引用所必需的?

在 Java 中存在一个 AtomicReference 类。这是否意味着设置引用本身不是原子操作?

例如,这不是线程安全的(假设返回的值不能被修改)?:

在 C# 中怎么样?

0 投票
3 回答
566 浏览

java - 带有 java 引用的竞争条件

原子整数、长整数、布尔值等用于对各自类型进行任何原子更新,因为当我们对它们执行任何操作时可能存在竞争条件,例如 ++。但是,在可能存在这种竞争条件的情况下,引用的不同情况是什么?

最好的问候,
凯沙夫

0 投票
8 回答
205250 浏览

java - 何时在 Java 中使用 AtomicReference?

我们什么时候使用AtomicReference

是否需要在所有多线程程序中创建对象?

提供一个应该使用 AtomicReference 的简单示例。

0 投票
2 回答
99 浏览

optimistic-concurrency - 2 threads performing myAtomicReference.compareAndSet(expected,new Date())

Q: If 2 threads executes it, which object will get stored in the atomic reference?

In a multi-processor machine, 2 threads could be performing the CAS in the same clock cycle. Suppose they both use the same myAtomicReference object to do the CAS, both use the correct value of "expected", but they try to put in 2 distinct objects ie the 2 newDate. One of them must fail, but will myStatus be false in that thread?

I guess one hardware implementation of CompareAndSwap would make the threads queue up to do their updates. I guess even if the 2 processors are executing the CAS instruction in the same clock cycle, one of them is probably delayed.

0 投票
2 回答
2207 浏览

java - 可以创建可以原子交换的 AtomicReference 吗?

有没有办法实现一种引用类型,其值可以与另一个原子交换?


在 Java 中,我们AtomicReference可以将其与局部变量交换,但不能与另一个AtomicReference.

你可以做:

并通过两种操作的组合交换它们:

但这使它们之间处于不一致的状态,两者都包含"hello". 此外,即使您可以原子地交换它们,您仍然无法原子地读取它们(作为一对)。


我想做的是:

然后

交换值,并在另一个线程中:

并确保输出为[hello, world][world, hello]

笔记:

  • r1r2为此操作配对,但另一个线程可能会独立配对,比如说r1和另一个r3(不幸的是,这意味着我不能使用这个解决方案。)
  • 将有数十万个这样的引用,因此全球ReentrantLock将是一个主要瓶颈。
  • rp并且otherRP不一定在线程之间共享,因此简单地锁定它们是行不通的。他们可以被实习,但实习池需要自己的同步,这将是另一个瓶颈。
  • 我在这里只做了 2 组参考,但是能够组合 3 组或更多组将是一个奖励。

是否可以实现的无锁版本AtomicRefPair?我有一种预感,但如果不是,那么也许某处有一篇文章解释了原因?


相关如何在 C# 中原子交换 2 个整数?

0 投票
1 回答
415 浏览

java - 任意可克隆数据的线程安全持有者

我有一个SomeMutableData带有公共clone()方法的类。我想确保没有线程看到不一致的状态(假设实例将仅使用持有者传递)。我认为使用同步是最安全的方法,对吧?

以下方法与第一种方法一样安全吗?

0 投票
3 回答
4039 浏览

java - AtomicReferenceFieldUpdater - 方法 set、get、compareAndSet 语义

来自 JavaAtomicReferenceFieldUpdater文档

请注意,compareAndSet此类中方法的保证比其他原子类中的要弱。因为这个类不能确保该字段的所有使用都适合原子访问的目的,所以它只能保证对 and 的其他调用的原子性和易失性compareAndSet语义set

这意味着我不能与 一起进行正常的易失性写入compareAndSet,但必须set改用。它没有提到任何关于get.

这是否意味着我仍然可以读取具有相同原子性保证的 volatile 字段 - 之前的所有写入setcompareAndSet对所有读取 volatile 字段的人都是可见的?

还是我必须在现场使用getAtomicReferenceFieldUpdater不是 volatile 读取?

如果您有参考资料,请张贴参考资料。

谢谢你。

编辑:

Java Concurrency in Practice中,他们唯一说的是:

更新程序类的原子性保证比常规原子类要弱,因为你不能保证底层字段不会被直接修改 - compareAndSet 和算术方法只保证使用原子字段更新程序方法的其他线程的原子性。

同样,没有提及其他线程应该如何读取这些易失性字段。

另外,我是否可以假设“直接修改”是常规的易失性写入?

0 投票
4 回答
3029 浏览

java - 对可变对象和可见性的 AtomicReference

假设我有一个AtomicReference对象列表:

线程 A将元素添加到此列表中:batch.get().add(o);

稍后,线程 B获取列表,例如,将其存储在数据库中:insertBatch(batch.get());

在写入(线程 A)和读取(线程 B)时,我是否必须进行额外的同步以确保线程 B 以 A 离开它的方式看到列表,或者这是否由 AtomicReference 处理?

换句话说:如果我有一个可变对象的 AtomicReference,并且一个线程更改了该对象,其他线程是否会立即看到此更改?

编辑:

也许一些示例代码是有序的:

这里发生的是我创建了四个工作线程来解析一些文本(这是方法的Reader in参数process())。每个工作人员将其已解析的行保存在一个批处理中,并在批处理已满时刷新该批处理 ( dao.insertBatch(batch.getAndSet(new ArrayList<Object>(batchSize)));)。

由于文本中的行数不是批次大小的倍数,因此最后一个对象最终会出现在未刷新的批次中,因为它未满。因此,这些剩余的批次由主线程插入。

我用AtomicReference.getAndSet()一个空的替换整个批次。这个程序在线程方面是否正确?

0 投票
2 回答
108 浏览

android - 如何通过 tabhost 创建对主要活动的引用

我需要从我的应用程序中的 tabhost 创建对这个特定类的引用。我创建这个引用的原因是访问这个特定类中的一些值。但是当我在我的 tabhost 活动中创建一个构造函数时,它会抛出一个运行时异常,说无法实例化 java.lang.instantiaionexception

03-21 10:17:29.382: E/AndroidRuntime(7637): java.lang.RuntimeException: 无法实例化活动 ComponentInfo{com.LiveGuardRSU/com.LiveGuardRSU.LiveGuardRSUSettingsTabHost}: java.lang.InstantiationException: com.LiveGuardRSU.LiveGuardRSUSettingsTabHost