问题标签 [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.
java - 将同步方法转换为非阻塞算法
随便找了一些关于非阻塞算法的资料,所以想在实践中使用。我将一些代码从同步更改为非阻塞,所以我想问一下我是否把一切都做对了并保存了以前的功能。
同步代码:
我在非阻塞算法中的替代方案:
我做的一切都是正确的,还是我错过了什么?对代码和使用非阻塞方法设置 abject 有什么建议吗?
java - 可变原子引用是个坏主意吗?
我有一个数据结构,我偶尔希望修改,偶尔希望彻底替换。目前,我将它存储在 AtomicReference 中,并在我需要修改它而不是替换它时使用同步块(在 AtomicReference 本身上同步,而不是它的存储值)。
所以像:
请注意,修改调用是包装值的成员,而不是原子引用,并且不能保证其自身具有任何线程安全性。
这安全吗?Findbugs(一个免费的代码审查工具)有这个说法,所以现在我担心引擎盖下发生了一些事情,它可能会过早地释放锁或其他东西。我还看到将 AtomicReference 引用为专门用于不可变事物的文档。
这安全吗?如果不是,我可以创建我自己的引用存储类,我会更确定它的行为,但我不想草率下结论。
java - AtomicReference 的各个元素的数据竞争
我有一个关于通过 Atomic Reference 访问单个元素的问题。如果我有一个 IntegerArray 和一个对它的原子引用;通过 AtomicReference 变量读取和写入数组的各个元素会导致数据竞争吗?
在下面的代码中: num 是一个整数数组,其中 aRnumbers 是对数组的原子引用。在线程 1 和 2 中;我访问 aRnumbers.get()[1] 并将其增加 1。
在两个线程完成后,我可以通过原子引用访问单个元素,而无需每次都使用 22 作为主线程中 aRnumbers.get()[1] 的输出来获得准确的结果。
但是,由于原子引用是在数组上而不是在单个元素上定义的;在这种情况下不应该存在导致 21/22 作为输出的数据竞争吗?
在这种情况下,是否存在数据竞争是拥有 AtomicIntegerArray 数据结构的动机,该数据结构为每个元素提供单独的 AtomicReference ?
请在下面找到我正在尝试运行的 java 代码。任何人都可以让我知道我哪里出错了。
java - AtomicIntegerArray 中的数据竞争
在下面的代码中:我在 2 个线程中更新num[1]=0
了AtomicIntegerArray
num 1000 次。
在主线程中的 2 个线程结束时;值不应num[1]
为 2000,因为AtomicIntegerArray
.
但是我得到随机值 < 2000。有人可以告诉我为什么吗?
代码:
编辑:添加num.compareAndSet(1, num.get(1), num.get(1)+1);
而不是也num.set(1,num.get(1)+1);
不起作用。
android - 帮助文件中意图和活动导航的 AtomicReferences
在我的应用程序中,我在大约 5 个不同的屏幕之间导航,每个屏幕都有自己的activity
. 几乎任何东西activity
都可以从任何其他地方调用activity
,所以我正在尝试构建一个帮助文件来管理它,intents
这样我就没有多余的代码。
我用方法构建了一个帮助文件,并在调用这些方法时public static
传递了活动和任何所需的数据。context
这似乎在我的设备(三星 Galaxy S5)上运行良好,但 Android Studio 建议在我的帮助文件中创建我的意图 AtomicReference。
你能帮我理解这些是否应该以及为什么应该这样AtomicReference<Intent>
吗?
另外,传递context
给帮助文件来进行这些调用是否合适?
ActivityHelper 文件:
从 AppCompatActivity 中的菜单调用帮助文件的示例:
java - 使用 AtomicReference 的带参数的单例
我必须创建一个接受输入参数的单例。基本上我需要根据一些配置在库中创建一个 DBConnector。现在,此配置由消费应用程序传递给库。根据传入的配置,我想创建一个 DBConnector 实例,然后在库中重用它。我想过使用 DI 来处理这个问题,但是当这个库被初始化时,我不知道是否真的需要一个 DB 连接,如果不需要,我也不想创建这个 DBConnector。初始化库后,在调用 getResponse(RequestType rt) 时,我会知道是否需要 DBConnector(基于 RequestType),这就是我需要创建实例的时候。因此下面的代码看起来适合多线程环境?
}
编辑 写了一个多线程测试,所有线程都得到相同的实例。但是只是想确保我不会因为 Java 内存模型而错过任何边缘情况
java - 在这种情况下使用适当的原子指针
假设我在 Java 中实现了 Herlihy-Wing 队列:
我正在使用数组的类型atomic<int *>
数据类型。items
但是在入队方法中,我需要做类似的事情items[i].store(&x)
,这显然是错误的,因为它是一个悬空的参考。如何正确执行此操作?如果我使用堆,我也不知道何时释放该内存。我怎样才能做到这一点?
java - 你应该为单例模式使用 AtomicReference 吗?
我遇到了AtomicReference类,想知道这是否是创建一个可变且可以替换以进行测试的 Singleton 的好方法。
我知道双锁检查有问题,所以我不想走那条路。 自 JDK 1.5 起更正,https://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html。
此外,我更愿意懒惰地实例化单例而不是初始化它。例如,在测试期间,我不想使用默认类SimpleExample
,但在某些情况下,它要么创建成本高,要么在某些环境中存在问题。我希望能够在请求之前更换它。
以下是我的问题:
- 有很大的性能影响吗?
- 是否存在我不知道将其用作 Singleton 的问题?
- 什么是合理的选择?
java - 将 AtomicReference 与 java lambda 一起使用是否合适?
我经常发现自己使用这个成语:
这是一个坏习惯,还是合法使用AtomicReference
?
java - AtomicReference 无法避免 java 多线程中的竞争条件
我有一个“User.java”类,它的整数变量计数最初设置为 0。在另一个类“ThreadDemo.java”中,我在 AtomicReference 中设置了用户对象。这个“userRef”对象由“1000”线程共享,在每个线程中,我将“count”值增加 1。但在这里我没有得到预期的答案 1000。每次执行“count”变量时都会给出不同的值,如 1000 ,1002 等。但是如果我尝试使用同步或 AtomicInteger 则它可以工作。所以我的问题是,在这种情况下,我是否正确使用 AtomicReference 概念来解决竞争条件。如果是,那么为什么我在这种情况下会失败?. 请在下面找到这段代码:User.java:-
ThreadDemo.java:-