Java和Round-Robin上的AtomicInteger

AtomicInteger属于Atomic Variables族。 主要好处是使用它不会阻塞而不是进行阻塞同步,因此避免了线程的挂起和重新调度。

AtomicInteger基于“比较和交换”机制,并且是原子变量的标量组的一部分。

我们的第一个用例是可以多次访问的网页上的功能。

 package com.gkatzioura.concurrency;  import java.util.concurrent.atomic.AtomicInteger;  public class AtomicIntegerExample { private AtomicInteger atomicInteger = new AtomicInteger(); public void serveRequest() { atomicInteger.incrementAndGet(); /** * logic */ } public int requestsServed() { return atomicInteger.get(); }  } 

并测试我们的用例

 package com.gkatzioura.concurrency;  import java.util.ArrayList;  import java.util.List;  import java.util.concurrent.ExecutionException;  import java.util.concurrent.ExecutorService;  import java.util.concurrent.Executors;  import java.util.concurrent.Future;  import org.junit.jupiter.api.Assertions;  import org.junit.jupiter.api.BeforeEach;  import org.junit.jupiter.api.Test;  public class AtomicIntegerExampleTest { private AtomicIntegerExample atomicIntegerExample; @BeforeEach void setUp() { atomicIntegerExample = new AtomicIntegerExample(); } @Test void testConcurrentIncrementAndGet() throws ExecutionException, InterruptedException { final int threads = 10 ; ExecutorService executorService = Executors.newFixedThreadPool(threads); List<Future> futures = new ArrayList(); for ( int i = 0 ; i { atomicIntegerExample.serveRequest(); return null ; })); } for (Future future: futures) { future.get(); } Assertions.assertEquals( 10 ,atomicIntegerExample.requestsServed()); }  } 

除了使用原子整数作为计数器之外,您还可以在各种情况下使用它。 例如线程安全的循环算法。

 package com.gkatzioura.concurrency;  import java.util.concurrent.atomic.AtomicInteger;  public class AtomicIntegerRoundRobin { private final int totalIndexes; private final AtomicInteger atomicInteger = new AtomicInteger(- 1 ); public AtomicIntegerRoundRobin( int totalIndexes) { this .totalIndexes = totalIndexes; } public int index() { int currentIndex; int nextIndex; do { currentIndex = atomicInteger.get(); nextIndex = currentIndex< Integer.MAX_VALUE ? currentIndex+ nextIndex = currentIndex< Integer.MAX_VALUE ? currentIndex+ 1 : 0 ; } while (!atomicInteger.compareAndSet(currentIndex, nextIndex)); return nextIndex % totalIndexes; }  } 

totalIndex是索引的总数。 当请求下一个索引的请求时,计数器将增加,并进行比较和设置操作。 如果由于另一个线程而失败,则它将再次尝试该操作,并将获得计数器的下一个值。
模运算将给出当前索引。 如果原子整数达到最大值,则应将其重置为零。 重置会导致边缘情况并更改索引的顺序。 如果这是一个问题,则可以根据总索引大小来调整最大值以避免这种情况。

还对此进行了一些测试。

 package com.gkatzioura.concurrency;  import java.util.ArrayList;  import java.util.List;  import java.util.concurrent.ExecutionException;  import java.util.concurrent.ExecutorService;  import java.util.concurrent.Executors;  import java.util.concurrent.Future;  import org.junit.jupiter.api.Assertions;  import org.junit.jupiter.api.BeforeEach;  import org.junit.jupiter.api.Test;  AtomicIntegerRoundRobinTest { class AtomicIntegerRoundRobinTest { private static final int MAX_INDEX = 10 ; private AtomicIntegerRoundRobin atomicIntegerRoundRobin; @BeforeEach void setUp() { atomicIntegerRoundRobin = new AtomicIntegerRoundRobin(MAX_INDEX); } @Test void testIndexesSerially() { for ( long i= 0 ;i<MAX_INDEX* 20 ;i++) { System.out.println(atomicIntegerRoundRobin.index()); } Assertions.assertEquals( 0 , atomicIntegerRoundRobin.index()); } @Test void testIndexesConcurrently() throws ExecutionException, InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool( 4 ); List<Future> futures = new ArrayList(); for ( int i = 0 ; i atomicIntegerRoundRobin.index())); } for (Future future: futures) { System.out.println(future.get()); } Assertions.assertEquals( 0 ,atomicIntegerRoundRobin.index()); }  } 

翻译自: https://www.javacodegeeks.com/2019/11/atomicinteger-on-java-and-round-robin.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341128.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VsCode打开终端的方法

方法1&#xff1a;打开终端的常规方法 打开VScode后&#xff0c;鼠标左键单击窗口顶部的【查看】&#xff08;如下图红圈标注&#xff09;&#xff0c; 在下拉列表中找到【终端】&#xff08;如下图红框标注&#xff09; 鼠标左键点击【终端】即可打开终端子窗口&#xff0c;如…

Ubuntu下VScode配置ssh免密远程登录

一 实现步骤 1.在本机与远程服务器上&#xff0c; 输入ssh-keygen -t rsa&#xff0c;然后连续回车直到结束 2.在本机上执行命令 ssh-copy-id 命令 &#xff08;1&#xff09;.命令介绍 ssh-copy-id命令可以把本地的ssh公钥文件安装到远程主机对应的账户下。 达到的功能&am…

VSCode隐藏左边活动栏

用sublime时间较长&#xff0c;VsCode左边的活动栏看上去有些多余。查询隐藏活动栏的快捷键&#xff0c;但没有找到。通过vscode怎么隐藏左边栏&#xff1f; - 知乎有快捷键可以隐藏左边栏么&#xff1f;https://www.zhihu.com/question/48285162 问题&#xff0c;找到相关处理…

java 从未导入_Java 8的10个您从未听说过的功能

java 从未导入Lambdas lambdas lambdas。 这是您在谈论Java 8时所听到的所有信息。但这只是一部分。 Java 8具有许多新功能-一些功能强大的新类和习惯用法&#xff0c;而另一些则是从一开始就应该存在的功能。 我想介绍十个新功能&#xff0c;我认为这些功能绝对是值得了解的小…

删除当前路径下含某个关键字的所有文件

一 查找含关键字的所有文件名 此处拿"T5"举例 1. 使用ls命令查找 ls -R | grep T5 # -R 显示文件夹内部所有文件 2. 使用find命令 find . -name "*T5*" 二 将查找到的文件删除 find . -name "*T5*" |xargs rm -rf xargs - build and exec…

Typora设置标题自动标号

Typora由于默认标题无法自动标号&#xff0c;每次编辑时需要手动处理。为实现标题自动编号&#xff0c;需要进行相关操作。 一 官方说明 To achieve this, add the following to your base.user.css or [theme].user.css in the theme folder. /** initialize css counter */ …

捕获Java堆转储的7个选项

堆转储是诊断与内存相关的问题的重要工件&#xff0c;例如内存泄漏缓慢&#xff0c;垃圾回收问题和java.lang.OutOfMemoryError。它们也是优化内存消耗的重要工件。 有很多很棒的工具&#xff0c;例如Eclipse MAT和Heap Hero&#xff0c;可以分析堆转储。 但是&#xff0c;您需…

Ubuntu对CPU进行测试

一 用 stress 工具对CPU进行压力测试 1.软件安装 sudo apt-get update #日常先更新再安装东西不容易出错 #下一條語句可以省略 sudo apt-get install -y linux-tools-$(uname -r) #系统基本功能安装 sudo apt-get install stress #安装stress软件 sudo stress -c 2 -t 100 …

第一章 基础算法(一)

文章目录排序快速排序--分治归并排序二分整数二分浮点数二分整体框架排序 快速排序–分治 785题目&#xff1a; 给定你一个长度为 n 的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式 输入共两行&#xff0c;第一行包含整数…

java8hashmap_Java 8中的HashMap性能改进

java8hashmapHashMap<K, V>是每个Java程序中快速&#xff0c;通用且无处不在的数据结构。 首先是一些基础知识。 您可能知道&#xff0c;它使用键的hashCode()和equals()方法在存储桶之间拆分值。 存储桶&#xff08;箱&#xff09;的数量应略高于映射中的条目数&#xf…

装前必看施工干货,贴瓷砖的5大步骤。福州中宅装饰,福州装修

亲爱的朋友们&#xff0c;你们是否曾经在装修房屋时遇到过贴砖的难题呢&#xff1f;贴砖可是装修工程中一项重要的工艺&#xff0c;它直接影响到整个装修的效果和质量。今天&#xff0c;我就来跟大家分享一下贴砖的几个重要要点&#xff0c;希望对你们有所帮助。 1️⃣ 选材是关…

Typora+Node.js+PicGo搭建图床

目录 一 问题背景 二 具体步骤 2.1 picgo的安装 1. 下载picgo 2. 安装 3. 效果 2.2 Node.js的安装 (1)下载链接 &#xff08;2&#xff09;安装步骤 2.3 Gitee设置 2.3.1在gitee上面创建一个仓库 2.4 整体配置 2.4.1 picgo软件配置 2.4.2 图床设置 2.4.3 Typora配…

JMetro版本11.6和8.6发布

再次返回另一个JMetro版本。 这是一个重要的里程碑&#xff0c;此版本中增加了样式&#xff0c;JavaFX库中的所有JavaFX控件现在都具有JMetro样式。 除此之外&#xff0c;还有用于ControlsFX StatusBar的新JMetro样式&#xff0c;对现有样式的样式调整&#xff0c;错误修复等。…

第一章 基础算法(二)

文章目录高精度高精度加法高精度减法高精度乘法高精度除法前缀和一维前缀和二维前缀和--求子矩阵中一部分和差分一维差分二维差分高精度 高精度加法 791 给定两个正整数&#xff08;不含前导 0&#xff09;&#xff0c;计算它们的和。输入格式 共两行&#xff0c;每行包含一个…

Win10窗口管理

快捷键功能Alt Esc将当前窗口置于底层Alt 空格 N最小化当前窗口Alt 空格 X最大化当前窗口 为方便管理窗口&#xff0c;用不到的窗口进行最小化处理Alt 空格 N,不同窗口之间使用Alt Esc切换

管理多个Java安装

随着越来越多的Java版本发布&#xff0c;在本地环境中管理多个Java安装将变得更加有趣。 不同的项目可能需要不同的Java版本。 jenv项目是管理Java安装的便捷方式。 它可以在全局&#xff0c;目录和外壳程序级别上设置本地Java安装&#xff0c;并使用易于记忆的Java版本标识符…

第一章 基础算法(三)

文章目录双指针算法双指针算法分类双指针算法模板性质&#xff1a;总结例1例2位运算二进制的第k位lowbit 返回x的最后一位1实现计算机中编码知识做题思路离散化区间合并双指针算法 双指针算法分类 双指针算法模板 性质&#xff1a; 总结 为什么双指针算法可以起到优化的作用&a…

怎样编写测试类测试分支_编写干净的测试-被认为有害的新内容

怎样编写测试类测试分支很难为干净的代码找到一个好的定义&#xff0c;因为我们每个人都有自己的单词clean的定义。 但是&#xff0c;有一个似乎是通用的定义&#xff1a; 简洁的代码易于阅读。 这可能会让您感到有些惊讶&#xff0c;但我认为该定义也适用于测试代码。 使测试…

不同字符串输入之间的区别

1 问题描述&#xff1a;scanf使用%c接受字符串 scanf使用%c接受字符串时无法识别回车符号 #include <iostream> int main() {char ch1,ch2;printf("Input for ch1:\n");scanf("%c",&ch1);printf("ch1%c\n",ch1);printf("Input …

第二章 数据结构(二)

文章目录Trie树存储并查集常规例题并查集维护多余信息堆性质存储基础操作downup操作例题Trie树 Tire&#xff1a;高效地存储和查找字符串集合的数据结构 存储 如果没有就创建。 对单词结尾进行标记&#xff0c;表示以当前节点结尾的地方存在一个单词 维护一个字符串集合&am…