java 字节序列_java – 这个线程安全的字节序列生成器有什么问题?

我需要一个字节生成器,它将生成从Byte.MIN_VALUE到Byte.MAX_VALUE的值.当它达到MAX_VALUE时,它应该从MIN_VALUE重新开始.

我使用AtomicInteger编写了代码(见下文);但是,如果同时访问并且如果使用Thread.sleep()人为地减慢了代码,那么代码似乎没有正常运行(如果没有睡眠,它运行正常;但是,我怀疑它对于出现并发问题来说太快了).

代码(添加了一些调试代码):

public class ByteGenerator {

private static final int INITIAL_VALUE = Byte.MIN_VALUE-1;

private AtomicInteger counter = new AtomicInteger(INITIAL_VALUE);

private AtomicInteger resetCounter = new AtomicInteger(0);

private boolean isSlow = false;

private long startTime;

public byte nextValue() {

int next = counter.incrementAndGet();

//if (isSlow) slowDown(5);

if (next > Byte.MAX_VALUE) {

synchronized(counter) {

int i = counter.get();

//if value is still larger than max byte value,we reset it

if (i > Byte.MAX_VALUE) {

counter.set(INITIAL_VALUE);

resetCounter.incrementAndGet();

if (isSlow) slowDownAndLog(10,"resetting");

} else {

if (isSlow) slowDownAndLog(1,"missed");

}

next = counter.incrementAndGet();

}

}

return (byte) next;

}

private void slowDown(long millis) {

try {

Thread.sleep(millis);

} catch (InterruptedException e) {

}

}

private void slowDownAndLog(long millis,String msg) {

slowDown(millis);

System.out.println(resetCounter + " "

+ (System.currentTimeMillis()-startTime) + " "

+ Thread.currentThread().getName() + ": " + msg);

}

public void setSlow(boolean isSlow) {

this.isSlow = isSlow;

}

public void setStartTime(long startTime) {

this.startTime = startTime;

}

}

并且,测试:

public class ByteGeneratorTest {

@Test

public void testGenerate() throws Exception {

ByteGenerator g = new ByteGenerator();

for (int n = 0; n < 10; n++) {

for (int i = Byte.MIN_VALUE; i <= Byte.MAX_VALUE; i++) {

assertEquals(i,g.nextValue());

}

}

}

@Test

public void testGenerateMultiThreaded() throws Exception {

final ByteGenerator g = new ByteGenerator();

g.setSlow(true);

final AtomicInteger[] counters = new AtomicInteger[Byte.MAX_VALUE-Byte.MIN_VALUE+1];

for (int i = 0; i < counters.length; i++) {

counters[i] = new AtomicInteger(0);

}

Thread[] threads = new Thread[100];

final CountDownLatch latch = new CountDownLatch(threads.length);

for (int i = 0; i < threads.length; i++) {

threads[i] = new Thread(new Runnable() {

public void run() {

try {

for (int i = Byte.MIN_VALUE; i <= Byte.MAX_VALUE; i++) {

byte value = g.nextValue();

counters[value-Byte.MIN_VALUE].incrementAndGet();

}

} finally {

latch.countDown();

}

}

},"generator-client-" + i);

threads[i].setDaemon(true);

}

g.setStartTime(System.currentTimeMillis());

for (int i = 0; i < threads.length; i++) {

threads[i].start();

}

latch.await();

for (int i = 0; i < counters.length; i++) {

System.out.println("value #" + (i+Byte.MIN_VALUE) + ": " + counters[i].get());

}

//print out the number of hits for each value

for (int i = 0; i < counters.length; i++) {

assertEquals("value #" + (i+Byte.MIN_VALUE),threads.length,counters[i].get());

}

}

}

在我的2核机器上的结果是值#-128得到146次点击(所有这些都应该得到100次点击,因为我们有100个线程).

如果有人有任何想法,这个代码有什么问题,我都是耳朵/眼睛.

更新:对于那些赶时间并且不想向下滚动的人来说,在Java中解决这个问题的正确(以及最短和最优雅)方式将是这样的:

public byte nextValue() {

return (byte) counter.incrementAndGet();

}

谢谢,亨氏!

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

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

相关文章

【C语言简单说】三:整数变量和输出扩展(2)

尼玛。。。简直蛋了个翔。。。 没保存&#xff0c;&#xff0c;&#xff0c;&#xff0c; ( E___E ) 念昏了头 注&#xff1a;注意我们每一行代码后面的分号表示我们一句代码的结束&#xff0c;就像我们在写文字的时候的标点符号&#xff0c;一个句号表示一句话的结尾。 注…

Makefile的写法

1.Makefile的规则 1.1 格式 目标&#xff1a;依赖命令…… 必须注意的是&#xff0c;命令前面的不是空格&#xff0c;而是制表符Tab。 1.2 伪目标 makefile中把那些只包含命令&#xff0c;没有任何依赖的目标称为”伪目标”(phony targets) 1 .PHONY: clean 2 clean: 3 …

C和指针之strcat函数 strchr函数 strcmp函数 strcpy函数 strnchr函数 strstr函数实现

1 strcat函数实现 #include <stdio.h> //简单实现strcat函数 char *my_strcat(char *des, const char *src) {if (des == NULL || src == NULL)return des;char *result = des;//把指针移到末尾while (*des)des++;printf("*des is %c\n", *des);while ((*des…

JavaScript三种弹出框(alert,confirm和prompt)用法举例

目 录 1. 警告(alert) 2. 确认(confirm) 3. 提问(prompt) 1. 警告(alert) 在访问网站的时候,你遇到过这样的情况吗?“咚”的一声,一个小窗口出现在你面前,上面写着一段警示性的文字,或是其它的提示信息。如果你不点击确定,你就不能对网页做任何的操作。没错,这个“…

UML 用例图

用例模型 用例模型用来记录系统的需求&#xff0c;它提供系统与用户及其他参与者的一种通信手段。 执行者 用例图显示了系统和系统外实体之间的交互。这些实体被引用为执行者。执行者代表角色&#xff0c;可以包括&#xff1a;用户&#xff0c;外部硬件和其他系统。执行者往往被…

Nginx实现tomcat集群进行负载均衡

一、背景 随着业务量和用户数量的激增&#xff0c;单一的tomcat部署应用已经无法满足性能需求&#xff0c;而且对于每次发布项目期间服务不可用的问题也凸显&#xff0c;既然出现了这个问题&#xff0c;那么我们本文就借助nginx来完美的解决这个问题。 二、基本概念 1.说明&…

【C语言简单说】三:整数变量扩展和输出扩展(3)

今日天气太好了&#xff0c;总感觉昏昏欲睡。。。 切记请勿荒废时间 小T今日来跟大家说说新建多个整数变量&#xff0c;以及输出多个变量的粒子&#xff0c;代码如下: #include<stdio.h> #include<stdlib.h> int main(){int a1,b2,c3;printf("a 的值是%d;b…

python删除列表中的偶数_Python:从列表中删除奇数

我写了一个函数来从列表中删除奇数,就像这样&#xff1a; def remove_odd(l): for i in l: if i % 2 ! 0: l.remove(i) print l return l remove_odd([4,5,4]) remove_odd([4,5,4,7,9,11]) remove_odd([4,5,4,7,9,11,12,13]) 它返回&#xff1a; [4, 4] [4, 4, 9] [4, 4, 9, 12…

MAUI初体验:爽

只是记录&#xff0c;只是Hello World体验&#xff0c;别期望太高。1. 前言经过几个小时折腾&#xff0c;Maui环境终于安装好了&#xff0c;先上Hello World截图&#xff1a;1.1 MAUI Windows上MAUI Windows1.2 MAUI Android上MAUI Android2. 今早看到一个群聊推送点击链接可以…

无法识别的属性“targetFramework”。请注意属性名称区分大写和小写。错误解决的方法...

“/CRM”应用程序中的server错误。 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错。请检查以下的特定错误具体信息并适当地改动配置文件。 分析器错误消息: 无法识别的属性“targetFramework”。请注意属性名称区分大写和小写。源错误: 行 24: 设…

windows之nslookup命令

1 问题 今天是特别傻逼,既然问了一个很愚蠢的问题,登录后台需要相关的ip,但是我只有域名,这么太突然来,我既然不知道用nslookup命令,好吧,先记录起来,希望下次不要犯这样的傻逼错误 2 查看电脑的所有配置 在windowd 终端输入如下命令 ifconfig/all 3 nslookup正…

C#对象初始化器

using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace 对象初始化器 {class Program{static void Main(string[] args){//第二种初始化var s1 new student("张三",23);Console.WriteLine(s1.ToString());//第一种初始化…

动态轮播图

1 /// <reference path"jquery-1.10.2.min.js" />2 var i 0;3 var timer; //设置定时器4 $(function () {5 $("#dlunbo").hover(function () {6 $(".btn").show();7 }, function () {8 $(".btn").hide…

Codeforces 41D Pawn 简单dp

题目链接&#xff1a;点击打开链接 给定n*m 的矩阵 常数k 以下一个n*m的矩阵&#xff0c;每一个位置由 0-9的一个整数表示 问&#xff1a; 从最后一行開始向上走到第一行使得路径上的和 % (k1) 0 每一个格子仅仅能向↖或↗走一步 求&#xff1a;最大的路径和 最后一行的哪个位…

【C语言简单说】三:浮点数变量和字符变量(4)

在最开始的时候&#xff0c;我们说过&#xff0c;我们的变量是有类型的对吧&#xff1f;&#xff08;其实我已经忘记我有没有说&#xff09;0o。(-. - ) 睡觉 这节我们就来说说&#xff0c;我们之前有整数变量了对吧&#xff1f;那个int就是整数类型的对吧&#xff1f;好了&am…

C#语法糖空合并运算符【??】和空合并赋值运算符【 ??=】

例子比如说:我们有一个UserInformation类public class UserInformation{ public string Name { get; set; }public List<string> Address { get; set; }}有下面一段代码,我们获取张三的第一个地址,如果地址为空&#xff0c;则返回上海市,常规做法如下static void Main(st…

DNS的理解

1 DNS是什么 DNS(Domain Name System) ,域名系统 作用:域名转化成ip 为什么要用DNS:访问一个网址需要知道ip,但是ip每个页面不同不方便记,我们需要给ip取一个别名,方便我们记忆,比如 www.baidu.com,这些域名我们记住就行了,但是怎么从这些域名转化成相应的ip呢?,我…

eos操作系统_EOS相机统一的用户界面

自EOS相机诞生起就未改变的基本布局精心设计的操作系统EOS数码单反相机从普及机型到高端机型的按钮布局都是共通的。快门按钮的位置自不必说&#xff0c;主拨盘位置和背面按钮的配置也基本相同。特点是在手柄一侧集中配置用于进行主要操作的按钮。实现了只用右手就能完成拍摄相…

CSS3中弹性盒布局的最新版

虽然可以使用其他CSS样式属性来实现页面布局处理&#xff0c;但是如果使用CSS Flexible Box模块中定义的弹性盒布局技术&#xff0c;可以根据屏幕尺寸或浏览器窗口尺寸自动调整页面中各局部区域的显示方式&#xff0c;即实现非常灵活的布局处理。虽然CSS Flexible Box模块已经被…

java filechannel 空_Java NIO FileChanel

http://www.cnblogs.com/interdrp/p/3785164.html(好)path--->path 耗时&#xff1a;49毫秒pos:1048576pos:2097152pos:3145728pos:4194304pos:5242880pos:6291456pos:7340032pos:8388608pos:9437184pos:10485760pos:11534336pos:12582912pos:13631488pos:14680064pos:15728…