问题标签 [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 - AtomicIntegerArray 与 BitSet 在性能方面的对比
想问一下 和的使用效率,在java并行流中使用时哪个性能更好?AtomicIntegerArray
BitSet
预先感谢您的帮助。
java - 协调两个线程时的并发问题
我试图将循环的工作分成两个线程。
我正在使用ExecutorService创建第二个线程,同时将主线程用作另一个线程。
我正在使用计数器在达到某个值时停止循环,但是我无法在这两个线程之间同步计数器,并且循环正在运行一个额外的时间。
另外,我在主线程中使用 while 循环来了解所需的计数何时达到打印结束时间,这也不起作用。
输出 -
在上面的代码中 PRINT_ME 应该只打印 5 次(int count = 5;),但打印了 6 次(额外打印一次)。
我不确定这里发生了什么以及我们如何在两个线程之间共享一个计数。
PSI:如果我添加 Thread.sleep(2000); 在两个循环中
输出是:
java - 原子变量上的可变关键字
以下代码在 Java 中有效
我们是否需要volatile
原子变量的关键字,例如AtomicInteger
?还是volatile
多余的?
java - AtomicInteger 是否处理同步?
如果两个线程都int i
使用i++递增相同,我们可能会遇到问题,因为i++不是原子操作。这就是为什么存在AtomicInteger.increment()
,这使得递增原子。因此,如果我们有 1 个核心和 2 个线程在做.increment()
,绝对没有问题(因为它不能在运行过程中暂停)。
但是,如果我们有 2 个内核和 2 个线程并且它们并行(在完全相同的时间)调用它increment()
呢?
他们是否有可能加载相同的值int i
?意思是如果int i
是1,最终结果将是2而不是3。在那种情况下,我们不在乎它是否是原子操作,因为它们都同时取相同的值..
底线:AtomicInteger 是否处理同步?
java - 以原子方式更新 2 个 Long 值
假设我在 Java 中有以下类:
现在我有一张此类记录的地图ConcurrentHashMap<String, Record> recordConcurrentHashMap;
我想创建一个线程安全的正确更新函数。
目前我已经这样做了:
我必须保持update
函数同步以实现正确性。
我可以在不synchronized
使用LongAdder
or的情况下执行此操作LongAccumulator
吗?
我尝试使用这些,但无法弄清楚如何使用它们实现复杂的计算。
java - 使用 AtomicInteger 的线程如何减少上下文切换次数?
我正在研究 AutomaticInteger。它声明使用 AtomicInteger 使整数运算成为非阻塞的。据说 AtomicInteger 的 compareAndSet() 方法利用了 Compare-and-set 特性。如果不成功,比较并设置功能将返回 false。为了使比较和设置成功,AtomicInteger 的 compareAndSet() 方法必须在无限循环中使用它。据说由于整数运算很小,所以在循环中等待比切换上下文更有好处。
据我了解,每个线程都有可用的固定时间量。如果一个线程不能在它的时间量内完成它的工作,它就必须被抢占。然后它会在以后再次获得机会。
所以我的问题是:
- 在无法获得 Synchronized 方法或块的锁定后,是否有任何线程在其时间量到期之前被抢占?如果是,该线程何时再次获得 CPU 时间?
- AtomicInteger 类的 compareAndSet() 方法中存在的一种自旋锁(无限循环)如何能够减少上下文切换时间?
java - Java中并行流中的BitSet
我想问一下我们如何在并行 java 中有效地使用线程安全的位集。我的意思是bitset有什么替代品吗?首先,我尝试使用 AtomicIntegerArray。但是,像 clear 或 clone 这样的方法不能用于 AtomicIntegerArray。谢谢您的帮助。
java - 原子整数值未在线程中更新
我在类中定义了一个 atomicinterger 变量。该类还扩展了线程类。我创建了两个线程并在运行方法中增加原子整数的值。我在运行两个线程后排除了 2 的值,但我得到的值为 1。请让我知道发生了什么下面的代码错误。
java - 当 AtomicInteger 比同步更快时
我已经阅读了大量文章,据说 AtomicInteger 类的工作速度比同步构造快。我对 AtomicInteger 和“同步”进行了一些测试,在我的测试中,同步比 AtomicInteger 快得多。我想了解出了什么问题:我的测试类不正确或 AtomicInteger 在其他情况下工作得更快?
这是我的测试课:
测试参数:3个线程和1_000_000个增量;结果:
测试同步:7 毫秒。测试原子整数:51 ms
我很高兴了解为什么会这样。
UPD如果将同步方法更改为同步块 ,则测试将正确。
java - 为什么运行以下代码后 count1 < count2?count1 和 count2 都应该是 2000000
在JDK11中编译运行,看看结果。sum1 是同步代码所用的时间,而 sum2 是 AtomicInteger 代码所用的时间。count1 是对同步 count++ 的调用次数进行计数的结果。count2 是相同数量的组合调用,但使用 AtomicInteger。计数应为 2000000,并且预计 sum1 > sum2 以 ms 为单位。但是,count1 明显减少了,那么电话会去哪里呢?