问题标签 [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 投票
4 回答
1915 浏览

java - 多个字段:volatile 还是 AtomicReference?

我必须将线程之间的访问同步到一个共享对象,该对象的状态由几个字段组成。说:

我可能有很多线程在读取这个对象,做

并且只有一个线程会在某个时间点写入:

现在我的问题是如何确保读取线程不会发现处于不一致状态的共享对象。

我读了很多答案,说线程之间的一致性volatile是解决方案,但我不确定它如何在多个字段上工作。例如,这就够了吗?

另一种解决方案是使共享对象不可变并使用 AtomicReference,例如,

然后作者将交换参考:

这种方法正确吗?谢谢!

更新在我的设置中,共享对象是从 a 中检索的ConcurrentHashMap<Id,Shared>,因此评论一致认为,要走的路要么使用不可变方法,要么通过将 shared 上的更新同步在一起。但是,为了完整起见,很高兴知道上面的解决方案ConcurrentHashMap<Id,AtomicReference<Shared>>是可行的还是错误的或者只是多余的。谁能解释一下?谢谢!

0 投票
2 回答
63 浏览

java - 每当我进行写入时,如何防止读取发生?

我正在尝试实现锁,我不希望在我写的时候发生读取。

以下是我ClientData正在使用的课程CountDownLatch-

问题陈述:-

我需要等待上面代码中的get三个电话。AtomicReferences一旦对我的三个调用完成了所有写入AtomicReferencesset那么我将允许对我拥有的三个 getter 进行调用。

所以我决定使用CountDownLatch我初始化为的1?我需要初始化它3吗?每次在我进行新更新的第一组之前,我是否需要将倒计时闩锁重新设置回 3?因为我将AtomicReferences在单独的三个语句中设置这三个。

我猜我上面的代码有问题吗?

笔记:-

我将在其他班级进行这样的设置-

其他一些线程在设置后必须从中读取数据AtomicReferences

更新:-

下面是我的后台线程代码,它将从 URL 获取数据,对其进行解析并将其存储在ClientData类变量中。

0 投票
1 回答
136 浏览

java - 使用无锁算法将值放入自定义对象的 Map

我有一张地图。为了更新密钥,我需要检查它是否已经存在。否则,我需要创建一个新对象并将其放入。

我的功能是这个

我不想使用同步。我猜它可能会被转换成Map<K,AtomicReference<Foo>> map = new ConcurrentHashMap<K, AtomicReference<Foo>>()并做value.compareAndSet(old, new)where valueis type AtomicReference<Foo>。然而,有两件事。密钥不存在的情况如何处理?以及如何在新旧 Foo 对象之间进行比较?

0 投票
0 回答
186 浏览

java - 原子参考不变

当用户输入数字表达式时,我的原子参考不会改变。我认为这与我的验证按钮事件处理程序中的行有关,card1.CardValue() == (int)expInput.get(0)但我不确定如何解决这个问题。我尝试放置deck.get(0).CardValue(),但该方法不起作用。我可以把我的甲板放在其他地方来完成这项工作吗?这是我的代码:

0 投票
1 回答
199 浏览

java - 使用同步时不需要原子引用

这段代码来自Fred Long的Java Concurrency Guidelines一书。我了解一组原子操作不是原子操作。所以下面的代码是不合规的。要查找代码,请查看第 23 页。

正确的解决方案如下所示:

但我认为正确解决方案中的原子引用是多余的,因为synchronized它保证了可见性和原子性。

所以我的解决方案看起来像这样:

我对吗?

0 投票
1 回答
326 浏览

java - Hazelcast - AtomicReference.alterAndGet 抛出 HazelcastSerializationException

我在同一台机器上运行三个 Hazelcast 节点,每个节点都尝试更改 AtomicReference。第一个和第二个节点运行没有问题,第三个节点抛出 HazelcastSerializationException。

Hazelcast 版本:Hazelcast 3.4.2 (20150326 - f6349a4)

有谁知道发生了什么?

我的代码:

0 投票
2 回答
92 浏览

java - How to add hostname to block list after consecutive failures in multithreading application?

I am using Callable in my code which will be called by multiple threads as shown below. As of now, whenever any RestClientException is thrown then I am adding hostname to blockList.

Below is what I have in DataMapping class:

Problem Statement:-

Now as you can see in call method, I am blocking the hostname as soon as it throws RestClientException which may not be right. I need to see if a particular hostname has thrown RestClientException for five times consecutively, then only add this hostname to blockList by calling this line DataMapping.blockHost(hostname); otherwise don't add it to the blockList.

What is the most efficient and best way to do this? Maximum, I will have 70-100 unique machines in total.

In this case, my call method will be called from multiple threads so I need to make sure I am keeping the count properly for each hostname in case they throw RestClientException.

EDIT:

I also have below method in DataMapping class as well:

I have a background thread which runs every 2 minutes that replaces the entire set, since my service provides real data whether any hostname is really blocked or not. And I guess I do need the atomic reference for when I replace the entire set.

I am adding block feature locally in the code as well since I might be to know which machine is blocked after 2 minutes so it's better to know it before hand if possible.

0 投票
1 回答
350 浏览

java - Java AtomicReferenceFieldUpdater - 使用泛型类型时出现 ClassCastException

我收到以下错误:

AtomicReferenceFieldUpdater用于泛型类型时。

我很困惑,我不知道为什么会出现这样的错误。

我正在使用的代码:

异常发生在这行代码中:

但是,如果我把它改成这样:

那么就不会有错误:| (但为什么???)

是什么导致了这个问题?以及如何解决?

谢谢。

0 投票
2 回答
604 浏览

java - 在复杂对象的情况下,AtomicReference 如何使用 CAS

AtomicReference 实例使用不安全的 CAS 操作来利用处理器指令进行锁定。但是我有点困惑它在复杂对象的情况下是如何工作的。

例如,假设我有一个 Person 类的实例(id、firstName、lastName)。我将对象实例共享给多个线程 t1、t2 和 t3。由于操作应该是原子的,所以我不会共享 Person 类对象实例,而是将该对象包装到 AtomicReference 实例中并与所有线程共享。

现在线程 t1 只更新 firstName,线程 t2 只更新 lastName,线程 t3 更新 firstName 和 lastName。之后,每个线程都会调用 compareAndSet 方法来反映新的变化。

此外,我正在使用 volatile 引用,以便写入可以发生在主内存中并且对所有线程可见。

我想了解:

  1. 在上述情况下,当 compareAndSet 被调用时,Person 类实例的预期值和新值之间会比较哪些内容(例如 id、firstName、lastName)?

  2. 假设线程 t1 更新了 firstName 并调用了 compareAndSet。线程 t2 更新了 lastName 并且将调用 compareAndSet。在这种情况下,AtomicReference 如何保证线程 t2 不会删除线程 t1 所做的更改,即更新 firstName?

  3. 假设 2 个线程 t1 和 t2 同时调用 compareAndSet,那么谁会赢得比赛,而其他输了的线程会发生什么?

0 投票
4 回答
4207 浏览

java - AtomicReference 中的 compareAndSet 和 weakCompareAndSet 有什么区别?

源代码是一样的。

重点是什么?