问题标签 [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.

0 投票
3 回答
392 浏览

java - AtomicInteger 如何是线程安全的

我正在阅读一些关于 Java 中原子变量的文档。正如到处都写的那样,AtomicInteger 应该是线程安全的。

根据我对原子整数的理解,它的工作原理是比较和交换算法。当两个线程尝试在完全相同的时间增加相同的原子变量时,我无法理解这将如何工作。

说我有定义AtomicInteger var = 1,这被两个线程Thread_1Thread_2. var当两个线程同时尝试增加 时会发生什么T1。我知道这将是罕见的情况,但如果它发生了怎么办。在比较和交换中,它在单个原子操作中读取和更新变量,并检查内存中的值。那么如果在 time T1-1, var 的值是 5 并且两者都Thread1Thread2开始递增呢?哪一个会失败?会是随机行为吗?或者我错过了一些非常基本的东西。

0 投票
4 回答
327 浏览

java - 原子整数计数器打印顺序错误

我定义了以下实例变量:

我有一个名为 onTrade 的方法,定义如下,由 6 个线程调用:

为什么输出:

2 5 4 3 1 6

而不是 1 2 3 4 5 6 ?

我想避免使用同步。

0 投票
2 回答
185 浏览

java - 使用 AtomicInteger 和 CountDownLatch 生成一个实例

我有一个类,我只想有一个实例。但是,我不希望多个线程调用getInstance(). 所以我用以下方式编码

我的意图(以及对此的理解)是:

  1. 当一个线程调用getInstance时,它会自动递增并检查它是否是所需的值。

  2. 如果没有,它将等待其他线程打开闩锁,这意味着初始化正在进行中。

如果有人帮助我纠正我的错误,那将会很有帮助。在我看来,我可能只是synchronized(someLockObject) {}阻止,但我想知道这是否有意义。

0 投票
2 回答
142 浏览

java - 是否有必要在 ThreadFactory 中使用 AtomicInteger?

我认为有必要AtomicInteger在 ThreadFactory 中使用,但是当我试图向自己证明时,我失败了。

如果有多个请求出现,线程工厂将生成线程来处理它们,并且在生成过程中,可能会出现竞争条件潜入的间隙。

我尝试使用以下代码来证明我的理论,但对于2_000 个核心线程,它根本没有发生。

看起来像一个愚蠢的问题,因为我一直都知道“很难为多线程竞争条件创造差距”。

任何帮助/线索将不胜感激;)

更新

非常感谢一路上的帮助,@StephenC 和 @Slaw。很抱歉我误解了那里的一些观点;(

所以newThread应该以线程安全的方式实现,然后在我的情况下,这AtomicInteger是必需的。我想引用 StephenC 的一句话:

未能证明竞争条件并不意味着它不存在。

0 投票
1 回答
979 浏览

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 指令级别)代码如下:

但我不确定与哪种代码“测试和设置”相关。

0 投票
2 回答
67 浏览

java - 预期在单线程上有序执行

由于服务是单线程的,monkey1 循环序列总是在monkey2 之前执行,所以我们可以预期monkey1 总是大于monkey2,不是吗?

0 投票
3 回答
1123 浏览

java - 如何为 UniqueId 编写 Java 序列生成器,它将在每天午夜自动重置为“1”(基本序列号)

我们有一个 Spring Boot 服务,我们每天都会收到文件,由于某些问题(在生产者上),我们收到了多个附加了相同名称和日期的文件。新文件覆盖旧文件,为了处理它,我们希望在每个文件名处附加一个序列(从 1 开始)。但是序列应该在每天午夜自动重置为“1”。

任何人都可以建议一个 API 或一种重置序列的方法。

为了生成自动序列,我们使用 AtomicSequenceGenerator ,但我们无法实现简单的自动重置逻辑。

0 投票
0 回答
409 浏览

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流实现这个吗?

样本输入:

预期的正确输出:

实际错误输出

0 投票
1 回答
284 浏览

java - 如何让 AtomicInteger 在 Runnable 类中工作

我用 Java 编写了这段代码Runnable,但我的教授希望我添加AtomicInteger,以免线程干扰。我该怎么做呢?我已经尝试查找如何在代码中使用它的示例,但我不知道在这种情况下该怎么做。

代码运行良好,但我的教授希望我AtomicInteger在代码中实现该类。

0 投票
2 回答
81 浏览

java - 具有两个 AtomicInteger 的线程安全方法是否可能?

我想编写一个线程安全的方法 sum() 但我不确定是否可以使用两个 AtomicInteger 来使其安全,还是必须使用同步块?