ThreadLocalRandom与Random区别

转自:

一文秒懂 Java ThreadLocalRandom - Java 一文秒懂 - 简单教程,简单编程随机数生成是一个非常常见的操作,而且 Java 也提供了 `java.util.Random` 类用于生成随机数,而且呢,这个类也是线程安全的,就是有一点不好,在多线程下,它的性能不佳。为什么多线程下,Random 的性能不佳?因为,它采用 - 简单教程,简单编程 https://www.twle.cn/c/yufei/javatm/javatm-basic-threadLocalrandom.html

补充: jmh

JMH: 最装逼,最牛逼的基准测试工具套件 - 简书JMH简介 官网:http://openjdk.java.net/projects/code-tools/jmh/ 简介:JMH is a Java harness for ...https://www.jianshu.com/p/0da2988b9846


一文秒懂 Java ThreadLocalRandom


随机数生成是一个非常常见的操作,而且 Java 也提供了 java.util.Random 类用于生成随机数,而且呢,这个类也是线程安全的,就是有一点不好,在多线程下,它的性能不佳。

为什么多线程下,Random 的性能不佳?

因为,它采用了多个线程共享一个 Random 实例。这样就会导致多个线程争用。

为了解决这个问题,Java 7 引入了 java.util.concurrent.ThreadLocalRandom 类,用于在多线程环境中生成随机数。

本文接下来的部分,就来看看如何 ThreadLocalRandom 如何执行以及如何在实际应用程序中使用它。


【1】ThreadLocalRandom Via Random

ThreadLocalRandom 是 ThreadLocal 类和 Random 类的组合,它与当前线程隔离,通过简单地避免对 Random 对象的任何并发访问,在多线程环境中实现了更好的性能。

也就是说,相比于 java.util.Random 类全局的提供随机数生成, 使用 ThreadLocalRandom,一个线程获得的随机数不受另一个线程的影响。

另一个与 Random 类不同的是,ThreadLocalRandom 不支持显式设置种子。因为它重写了从 Random 继承的 setSeed(long seed) 方法,会在调用时始终抛出 UnsupportedOperationException

接下来我们看看如何使用 ThreadLocalRandom 生成随机 intlong 和 double 值。


【2】使用 ThreadLocalRandom 生成随机数

根据 Oracle 文档,我们只需要调用 ThreadLocalRandom.current() 方法,就能返回当前线程的 ThreadLocalRandom 实例。然后,我们可以通过实例的相关方法来生成随机值。

比如下面的代码,生成一个没有任何边界的随机 int 值

int unboundedRandomValue = ThreadLocalRandom.current().nextInt());

其实是有边界的,它的边界就是 int 的边界。

接下来,我们看看如何生成有边界的随机 int 值,这意味着我们需要传递边界下限和边界上限作为参数

int boundedRandomValue = ThreadLocalRandom.current().nextInt(0, 100);

请注意,这是一个左闭右开区间,也就是说,上面的实例生成的随机数在 [0,100) 之间,包含了 0 但不包含 100。

同样的,我们可以通过调用 nextLong() 和 nextDouble() 方法生成 long 和 double 类型的随机值,调用方式与上面示例中 nextInt() 类似。

Java 8 还添加了 nextGaussian() 方法从生成器序列中生成下一个正态分布的值,其值范围在 0.0 和 1.0 之间。

与 Random 方法类似,ThreadLocalRandom 也提供了 doubles() 、ints() 和 longs() 方法生成一序列流式 ( stream ) 的随机值。


【3】使用 JMH 比较 ThreadLocalRandom 和 Random

记下来,我们看看如何在多线程环境中分别使用这两个类生成随机值,然后再使用 JMH 比较它们的性能。

首先,我们创建一个示例,其中所有线程共享一个 Random 实例

ExecutorService executor = Executors.newWorkStealingPool();
List<Callable<Integer>> callables = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < 1000; i++) {callables.add(() -> {return random.nextInt();});
}
executor.invokeAll(callables);

上面的代码中,我们把使用 Random 实例生成随机值的任务提交给 ExecutorService 。

然后,我们使用 JMH 基准测试来检查上面代码的性能

# Run complete. Total time: 00:00:36
Benchmark                                            Mode Cnt Score    Error    Units
ThreadLocalRandomBenchMarker.randomValuesUsingRandom avgt 20  771.613 ± 222.220 us/op

接着,类似地,我们使用 ThreadLocalRandom 而不是 Random 实例

ExecutorService executor = Executors.newWorkStealingPool();
List<Callable<Integer>> callables = new ArrayList<>();
for (int i = 0; i < 1000; i++) {callables.add(() -> {return ThreadLocalRandom.current().nextInt();});
}
executor.invokeAll(callables);

上面的代码,为线程池中的每个线程单独使用了一个 ThreadLocalRandom 实例。

下面是使用 JMH 对 ThreadLocalRandom 的测试结果

# Run complete. Total time: 00:00:36
Benchmark                                                       Mode Cnt Score    Error   Units
ThreadLocalRandomBenchMarker.randomValuesUsingThreadLocalRandom avgt 20  624.911 ± 113.268 us/op

通过 JMH 的测试结果中可以看出,使用 Random 生成 1000 个随机值所花费的平均时间是 772 微秒,但使用 ThreadLocalRandom 只花了 625 微秒。嗯,差距不是很大,但好歹也是有差距的,因为生成 1000 个随机数是瞬间的事情。

因此,我们可以得出结论,ThreadLocalRandom 在高度并发的环境中更有效

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

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

相关文章

python自动配置文件_【python接口自动化】- ConfigParser配置文件的使用

前言&#xff1a;目前我们使用的绝大多数计算机程序&#xff0c;无论是办公软件&#xff0c;浏览器&#xff0c;甚至游戏、视频都是通过菜单界面系统配置的&#xff0c;它几乎成了我们使用机器的默认方式。而在python中&#xff0c;也有这样的一个配置模块可以把代码可配置化。…

JAVA面试常考系列十

转载自 JAVA面试常考系列十 题目一 Servlet是什么&#xff1f; Servlet&#xff08;Server Applet&#xff09;是Java Servlet的简称&#xff0c;称为小服务程序或服务连接器&#xff0c;是用Java编写的服务器端程序&#xff0c;主要的作用是处理客户端请求并生成动态Web内容。…

DotNet 资源大全

Awesome DotNet&#xff0c;这又是一个 Awesome XXX 系列的资源整理&#xff0c;由 quozd 发起和维护。内容包括&#xff1a;编译器、压缩、应用框架、应用模板、加密、数据库、反编译、IDE、日志、风格指南等。 伯乐在线已在 GitHub 上发起「DotNet 资源大全中文版」的整理。欢…

javabean与json转换(fastjson与jackson两个版本)

【README】 本文演示了 javabean与json转换的开发方式&#xff1b; 要想 javabean的属性名 与 json的字段名不一致&#xff0c;也是可以转换的&#xff1b; 之前需要引入 ali.fastjson <dependency><groupId>com.alibaba</groupId><artifactId>fas…

mysql数据库新建一个递增的_分享一个mysql实验—基于数据库事务隔离级别RR及RC的测试...

概述今天主要分享一个最近做的实验&#xff0c;主要是测试mysql数据库在RR和RC不同事务隔离级别下的表现。MySQL使用可重复读来作为默认隔离级别的主要原因是语句级的Binlog。RR能提供SQL语句的写可串行化&#xff0c;保证了绝大部分情况(不安全语句除外)的DB/DR一致。下面以my…

直面Java第45期

转载自 直面Java第45期

ABP框架搭建项目系列教程基础版

我现在要着手一个新的项目&#xff0c;也打算用这个框架&#xff0c;所以想要将我一步一步用这个框架的做项目的步骤和想法跟大家分享出来。 经过前面十二篇的基础教程&#xff0c;现在终于该做个总结了。 第一篇&#xff0c;我们建议新手朋友们先通过ABP官网的启动模板生成解决…

字节数组转jsonobject(如读取HttpServletRequest.inputstream到jsonobject)

【README】 本文po出了 如何读取 字节数组到jsonobject&#xff1b; 字节数组如何获取&#xff0c;本文不再赘述&#xff1b; 【1】代码 /*** Description 字节数组转json演示* author xiao tang* version 1.0.0* createTime 2022年02月11日*/ public class ByteArr2JsonDem…

sql server 2008安装_性能不够?基于时序数据库的Zabbix 5.2安装指南

我们往往在谈论zabbix的优缺点的时候&#xff0c;提到最多的依然还是数据库(默认采用关系型数据库)&#xff0c;由于关系型数据库所有的读写都是采用sql语句解析&#xff0c;一但并发过大或者数据量过大&#xff0c;处理能力就显得捉襟见肘&#xff0c;这也是Zabbix让人诟病的地…

对象并不一定都是在堆上分配内存的

转载自 对象并不一定都是在堆上分配内存的 JVM内存分配策略 关于JVM的内存结构及内存分配方式&#xff0c;不是本文的重点&#xff0c;这里只做简单回顾。以下是我们知道的一些常识&#xff1a; 1、根据Java虚拟机规范&#xff0c;Java虚拟机所管理的内存包括方法区、虚拟机栈、…

Bash on Windows 抢鲜测试 -- 介绍及安装

前言 微软在上周的Windows BUILD大会上宣布&#xff0c;WIN10将引入原生Bash&#xff0c;并将很快在技术预览版中推出。 如此一来&#xff0c;windows的命令行工具就不再只有cmd和powershell了&#xff0c;我们可以还可以使用bash。 今天&#xff08;2016/4/8&#xff09;收到了…

jvm的client与server工作模式

【README】 JVM Server模式与client模式启动&#xff0c;最主要的差别在于&#xff1a; -Server模式启动时&#xff0c;速度较慢&#xff0c;但是一旦运行起来后&#xff0c;性能将会有很大的提升. 原因是:当虚拟机运行在-client模式的时候,使用的是一个代号为C1的轻量级编译…

python重定向到socket_python套接字流重定向实例汇总

#!/usr/bin/env python3"""测试socket-stream 重定向模式"""import sys,os,timefrom multiprocessing import Processfrom socket import *def initListenerSocket(port50008,host):"""初始化在服务器模式下调用者用于监听连接的…

Spring Boot的自动化配置原理

转载自 Spring Boot的自动化配置原理 随着Ruby、Groovy等动态语言的流行&#xff0c;相比较之下Java的开发显得格外笨重。繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大等问题一直被人们所诟病。随着Spring家族中的新星Spring Boot的诞生&#xff0c;这…

复盘Build 2016:不要错过微软给.NET开发者的这些福利

本文作者陈计节&#xff0c;ThoughtWorks 高级咨询师。多年的跨平台 .NET 开发者&#xff0c;全栈工程师&#xff0c;技术布道师。擅长互联网应用程序的设计、开发和运维等工作。 近年来&#xff0c;微软坚持为社区提供更多灵活性&#xff0c;并以更开放的思路重构其已有平台&a…

java异步线程内存可见性实验

【README】 本文演示了内存可见性的场景&#xff0c;以及解决方法&#xff1b; 相关定义如下&#xff08;转自java并发编程实战&#xff0c;一本好书&#xff0c;强烈推荐&#xff09;&#xff1a; 内存可见性&#xff1a;一个线程修改了对象状态后&#xff0c; 其他线程可以…

springboot 单例_如何实现一个单例及优化

前言 社长,一个爱学习,爱分享的程序猿,始终相信,付出总会有回报的。 知识改变命运,学习成就未来。爱拼才会赢! 程序猿学社的GitHub,已整理成相关技术专刊,欢迎 Star:。 https:// github.com/ITfqyd/cxyxs 社长,4年api搬运工程师,之前做的都是一些框架的搬运工作,做的时间…

乐观锁的一种实现方式——CAS

转载自 乐观锁的一种实现方式——CAS在深入理解乐观锁与悲观锁一文中我们介绍过锁。本文在这篇文章的基础上&#xff0c;深入分析一下乐观锁的实现机制&#xff0c;介绍什么是CAS、CAS的应用以及CAS存在的问题等。线程安全 众所周知&#xff0c;Java是多线程的。但是&#xff0…

熬夜并不值得程序员炫耀

许多程序嘴上经常挂着每天加班到凌晨三点的论调&#xff0c;但事实上这没什么值得炫耀的&#xff0c;加班通常都是效率低的代名词。 放弃睡眠就像是高利贷借款。没错&#xff0c;看上去你是得到了额外的时间&#xff0c;但你想得太乐观了&#xff0c;你知道代价是什么吗&#x…

前端wxml取后台js变量值_这些鲜为人知的前端冷知识,你都GET了吗?

背景最近公司项目不多&#xff0c;比较清闲&#xff0c;划水摸鱼混迹于各大技术博客平台&#xff0c;瞬间又GET了好多前端技能&#xff0c;一些属于技巧&#xff0c;一些则是闻所未闻的冷知识&#xff0c;一时间还消化不过来&#xff0c;不由的发出一声感叹&#xff01;前端可真…