问题标签 [atomicinteger]
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 - AtomicInteger 如何是线程安全的
我正在阅读一些关于 Java 中原子变量的文档。正如到处都写的那样,AtomicInteger 应该是线程安全的。
根据我对原子整数的理解,它的工作原理是比较和交换算法。当两个线程尝试在完全相同的时间增加相同的原子变量时,我无法理解这将如何工作。
说我有定义AtomicInteger var = 1
,这被两个线程Thread_1
和Thread_2
. var
当两个线程同时尝试增加 时会发生什么T1
。我知道这将是罕见的情况,但如果它发生了怎么办。在比较和交换中,它在单个原子操作中读取和更新变量,并检查内存中的值。那么如果在 time T1-1
, var 的值是 5 并且两者都Thread1
将Thread2
开始递增呢?哪一个会失败?会是随机行为吗?或者我错过了一些非常基本的东西。
java - 原子整数计数器打印顺序错误
我定义了以下实例变量:
我有一个名为 onTrade 的方法,定义如下,由 6 个线程调用:
为什么输出:
2 5 4 3 1 6
而不是 1 2 3 4 5 6 ?
我想避免使用同步。
java - 使用 AtomicInteger 和 CountDownLatch 生成一个实例
我有一个类,我只想有一个实例。但是,我不希望多个线程调用getInstance()
. 所以我用以下方式编码
我的意图(以及对此的理解)是:
当一个线程调用
getInstance
时,它会自动递增并检查它是否是所需的值。如果没有,它将等待其他线程打开闩锁,这意味着初始化正在进行中。
如果有人帮助我纠正我的错误,那将会很有帮助。在我看来,我可能只是synchronized(someLockObject) {}
阻止,但我想知道这是否有意义。
java - 是否有必要在 ThreadFactory 中使用 AtomicInteger?
我认为有必要AtomicInteger
在 ThreadFactory 中使用,但是当我试图向自己证明时,我失败了。
如果有多个请求出现,线程工厂将生成线程来处理它们,并且在生成过程中,可能会出现竞争条件潜入的间隙。
我尝试使用以下代码来证明我的理论,但对于2_000 个核心线程,它根本没有发生。
看起来像一个愚蠢的问题,因为我一直都知道“很难为多线程竞争条件创造差距”。
任何帮助/线索将不胜感激;)
更新
非常感谢一路上的帮助,@StephenC 和 @Slaw。很抱歉我误解了那里的一些观点;(
所以newThread
应该以线程安全的方式实现,然后在我的情况下,这AtomicInteger
是必需的。我想引用 StephenC 的一句话:
未能证明竞争条件并不意味着它不存在。
java - 哪些 AtomicInteger 方法是 test-and-set、fetch-and-add 和 compare-and-swap(就无锁算法而言)?
CAS(比较和交换):boolean compareAndSet(int expect, int update)
FAA(获取并添加):int addAndGet(int delta)
???
TAS(测试和设置):???
据我了解:
CAS(比较和交换)“同步”(不带锁,在 CPU 指令级别)代码如下:
FAA ( fetch-and-add ):“同步”(无锁,在 CPU 指令级别)代码如下:
但我不确定与哪种代码“测试和设置”相关。
java - 预期在单线程上有序执行
由于服务是单线程的,monkey1 循环序列总是在monkey2 之前执行,所以我们可以预期monkey1 总是大于monkey2,不是吗?
java - 如何为 UniqueId 编写 Java 序列生成器,它将在每天午夜自动重置为“1”(基本序列号)
我们有一个 Spring Boot 服务,我们每天都会收到文件,由于某些问题(在生产者上),我们收到了多个附加了相同名称和日期的文件。新文件覆盖旧文件,为了处理它,我们希望在每个文件名处附加一个序列(从 1 开始)。但是序列应该在每天午夜自动重置为“1”。
任何人都可以建议一个 API 或一种重置序列的方法。
为了生成自动序列,我们使用 AtomicSequenceGenerator ,但我们无法实现简单的自动重置逻辑。
java - 使队列达到最终状态所需的最小交换次数,每个元素不超过 2 次交换
场景或问题陈述:
这是元旦,每个人都在排队参加仙境过山车!有很多人在排队,每个人都戴着一个贴纸,表明他们在队列中的初始位置。初始位置从行前面的 1 到后面的 n 递增 1。
队列中的任何人都可以贿赂直接排在他们前面的人以交换位置。如果两个人交换位置,他们仍然会佩戴相同的标签,表示他们原来的位置。一个人最多可以贿赂另外两个人。例如,如果 n = 8 并且第 5 个人贿赂第 4 个人,则队列将如下所示:1,2,3,5,4,6,7,8。
对这个混乱的队列着迷,您决定必须知道为使队列进入当前状态而发生的最低贿赂次数!
功能说明
在下面的编辑器中完成函数 minimumBribes。它必须打印一个整数,表示必要的最低贿赂数量,或者如果线路配置不可能,则太混乱。
minimumBribes 具有以下参数:
q:整数数组
输入格式
第一行包含一个整数,即测试用例的数量。
接下来的每一对行如下: - 第一行包含一个整数,即队列中的人数 - 第二行包含以空格分隔的整数,描述队列的最终状态。
输出格式
打印一个整数,表示使队列进入最终状态所需的最小贿赂数。打印状态无效时太乱,即要求人贿赂人多。
样本输入
样本输出
我基本上是在尝试创建一个方法,该方法在此(最终)状态下接受队列的值,并返回从 1、2、3、4、5、... 开始到达最终状态所需的贿赂数量。状态,如果队列中每人的贿赂数量不超过 2,否则“太混乱”。
使用 java 流在少数情况下失败的代码如下,我想知道为什么我无法使用 Java 流实现输出?
不使用 java 流通过的代码如下:
如果有的话,你能帮忙推荐一些改变来用java流实现这个吗?
样本输入:
预期的正确输出:
实际错误输出
java - 如何让 AtomicInteger 在 Runnable 类中工作
我用 Java 编写了这段代码Runnable
,但我的教授希望我添加AtomicInteger
,以免线程干扰。我该怎么做呢?我已经尝试查找如何在代码中使用它的示例,但我不知道在这种情况下该怎么做。
代码运行良好,但我的教授希望我AtomicInteger
在代码中实现该类。
java - 具有两个 AtomicInteger 的线程安全方法是否可能?
我想编写一个线程安全的方法 sum() 但我不确定是否可以使用两个 AtomicInteger 来使其安全,还是必须使用同步块?