这将不是说明随机数生成器毕竟不是那么随机的文章之一。 因此,您中的那些人希望获得有关如何破解老虎机,继续前进的指南,在这里什么也看不到。

相反,它是有关一个不太常见的锁争用问题的帖子,该问题隐藏在Java API的随机数生成器中。

要打开该主题,让我们开始研究如何在java.util.Random类中处理并发。 java.util.Random的实例是线程安全的。 但是,在线程之间并发使用同一java.util.Random实例是同步的,并且我们已经发现趋向于触发影响应用程序性能的争用问题。

在您的日常企业应用程序中,这听起来似乎不是一个重要的问题–毕竟,您实际上有多少次实际执行了故意无法预测的事情? 相反,您只是在按照可预见的方式遵循业务规则。 我必须承认,尽管在某些情况下,这些业务规则比真正的随机种子生成算法所涉及的熵甚至更大,但这完全是另一回事。

但是,魔鬼隐藏在细节中,在这种情况下,碰巧是java.util.Random的子类,即java.util.SecureRandom 。 此类,如名称所述,应在随机数生成器的结果必须是加密安全的情况下使用。 由于人类未知的原因,在通常不希望随机性的密码安全方面具有重要意义的情况下,该实现已被选择为许多常见API的主干。

我们通过密切关注锁争用检测解决方案的采用来亲身体验这个问题。 根据结果​​,通过看上去无害的java.io.File.createTempFile()调用触发了Java应用程序中最常见的锁定问题之一。 在后台,这种临时文件的创建依赖于SecureRandom类来计算文件的名称。

private static final SecureRandom random = new SecureRandom();
static File generateFile(String prefix, String suffix, File dir) {long n = random.nextLong();if (n == Long.MIN_VALUE) {n = 0;      // corner case} else {n = Math.abs(n);}return new File(dir, prefix + Long.toString(n) + suffix);
}

然后,在调用nextLong时,SecureRandom最终调用其方法nextBytes() ,该方法定义为synced :

synchronized public void nextBytes(byte[] bytes) {secureRandomSpi.engineNextBytes(bytes);
}

有人会说,如果我在每个线程中创建新的SecureRandom,我将不会遇到任何问题。 不幸的是,这并不是那么简单。 SecureRandom使用java.security.SecureRandomSpi的实现,无论如何最终都会争夺它(您可能会在Jenkins问题跟踪器中看到以下带有一些基准的bug讨论)

这与某些应用程序使用模式结合在一起(尤其是如果您有许多SSL连接依靠SecureRandom来实现其加密握手魔术),则有形成长期持久争用问题的趋势。

如果您可以控制源代码,则解决此问题的方法很简单–只需重建解决方案即可依靠java.util.ThreadLocalRandom进行多线程设计。 如果您坚持使用标准API,则解决方案可能会更复杂,并且需要大量重构。

故事的道德启示? 并发很难。 尤其是在您的系统构建块没有考虑到这一点时。 无论如何,我确实希望这篇文章至少从两个新库的诞生中拯救世界,在新库中,随机数生成器将成为竞争点。

翻译自: https://www.javacodegeeks.com/2015/03/shooting-yourself-in-the-foot-with-random-number-generators.html

用随机数发生器射击自己的脚相关推荐

  1. 随机数发生器怎么用_用随机数发生器射击自己的脚

    随机数发生器怎么用 这将不是解释随机数生成器毕竟不是那么随机的文章之一. 因此,您中的那些人希望获得有关如何破解老虎机,继续前进的指南,在这里什么也看不到. 相反,它是有关一个不太常见的锁争用问题的帖 ...

  2. 量子计算机真随机数,量子真随机数发生器研究取得进展

    量子真随机数发生器研究取得进展 超高速真随机数发生器简化设计方案(上)与后处理方法(下) 信息科学技术学院郭弘教授课题组与物理学院张建玮副教授课题组开展合作,在用光学随机源设计研制量子真随机数发生器的 ...

  3. OpenCV 【十六】RNG随机数发生器putText绘制文字

    1 目的 使用 随机数发生器类 (RNG) 并得到均匀分布的随机数. 通过使用函数 putText 显示文字. 第一步是实例化一个 Random Number Generator(随机数发生器对象) ...

  4. c51汇编语言随机数函数,汇编语言随机数发生器

    我最近开始学习汇编语言.对于我正在研究的项目,我必须使用线性一致性来生成随机数生成器.我想拿三个数字.上限,下限和我想要的随机数的数量.如式为获得一个随机数,我想出了....汇编语言随机数发生器 ra ...

  5. OpenCV之core 模块. 核心功能(2)基本绘图 随机数发生器绘制文字 离散傅立叶变换 输入输出XML和YAML文件 与 OpenCV 1 同时使用

    基本绘图 目的 本节你将学到: 如何用 Point 在图像中定义 2D 点 如何以及为何使用 Scalar 用OpenCV的函数 line 绘 直线 用OpenCV的函数 ellipse 绘 椭圆 用 ...

  6. 【STM32】随机数发生器相关函数和类型

    00. 目录 文章目录 00. 目录 01. RNG概述 02. 相关类型 03. 相关函数 04. 结构体封装 05. 预留 06. 附录 07. 声明 01. RNG概述 RNG 处理器是一个以连 ...

  7. 【STM32】随机数发生器详解

    00. 目录 文章目录 00. 目录 01. 随机数发生器简介 02. 随机数发生器主要特性 03. 随机数发生器功能说明 04. 随机数发生器操作 05. 随机数发生器寄存器 5.1 RNG 控制寄 ...

  8. 基础学习笔记之opencv(14):随机数发生器绘制文字

    本文主要介绍下opencv中自带的一个随机数发生器的类RNG,这里我用这个类来画一些图形,和基础学习笔记之opencv(13):基本绘图 一文中类似,只是 这里画出来图像的坐标,大小,颜色,角度等所有 ...

  9. 一个随机数发生器(一)

    老黄.老银和老阳共事宇宙中心某互联网企业H,并且同在一个由校招新生组成的Team里.刚走出校园的他们,对自己去年在校招这场演技大比拼中的表现意犹未尽,因此常会拿一些没什么实际意义的技术问题大谈特谈. ...

最新文章

  1. POJ 1552 Doubles (C++ STL set使用)
  2. elasticsearch 安装
  3. Android Studio编译后报错 java.exe'' finished with non-z
  4. matlab保存figure图像中所有的点的坐标
  5. The prefix context for element context:component-scan is not bound.
  6. Struts2之路第一天
  7. vue v-for 不能自能渲染问题
  8. 工作23:vue---封装request做数据请求
  9. python 正则替换_5分钟速览Python正则表达式常用函数!五分钟就掌握它!
  10. n平方的求和公式_极限求解--数列前n项和公式推导(补充知识)
  11. Automatic Brain Tumor Segmentation using Cascaded Anisotropic Convolutional Neural Networks
  12. ASP.Net Web 点击链接直接下载 不在浏览器打开
  13. 素数表的C++实现:快速进行素数筛选(埃氏筛法)
  14. matlab幻方变换_Matlab入门1-幻方矩阵
  15. 华为的5G到底有多厉害?
  16. 第3章第1节:使用图片来活跃整张幻灯片版面的气氛 [PowerPoint精美幻灯片实战教程]
  17. 读论文《对 感知音频质量 的 客观评估 综述---对其 应用领域依赖性 的评估》
  18. 低分辨率人脸识别(LRFR)相关文章整理——(待更)
  19. 苹果cms的php.ini,苹果cms伪静态设置教程
  20. 背单词app软件测试与评估

热门文章

  1. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——struts.xml配置详情
  2. 多线程三种同步方式(模拟银行取款)
  3. == 和 equals() 区别
  4. 机器学习(周志华)- 第2章模型评估与选择笔记
  5. XML——文档类型定义(DTD-Document Type Definition)
  6. 如何添加数据到session中
  7. java oca_OCA第7部分中的Java难题
  8. aws生态系统集成商_通过通用数据访问扩展AWS生态系统
  9. java观察者设计模式_Java中的观察者设计模式
  10. 日志间隔_在日志中搜索时间间隔