当前位置: 首页 > 网络应用技术

在掺入高的情况下,请尝试使用螺纹锁定器生成随机数

时间:2023-03-08 20:18:43 网络应用技术

  一个:简短描述

  如果我们想生成一个随机数,通常会使用随机类。但是,随机生成随机数的性能不是理想的。今天,我将向您介绍用于生成随机数字threadLocalrandom的类。(本文基于JDK1.8)

  两个:随机的表现在哪里

  随机随机数生成与种子相关,为了确保线程安全性,随机使用CAS机制来确保线程安全性。从NEXT()方法,我们可以发现种子是通过旋转锁定的,cas.if in一个高的并发情况,它可能导致CAS的连续故障并导致连续旋转,这可能导致服务器过高。

  三:简单地使用ThreadLocalrandom

  使用方法非常简单。通过threadlocalrandom通过threadlocalrandom.current()实例,然后通过NextInt(),nextlong()的方法获取一个随机数。

  代码:

  操作结果:

  四:为什么在线程的安全性下,螺纹链汇集仍然具有良好的性能

  我们可以查看threadlocalrandom的代码实现。

  首先,我们很容易看到这是一个饥饿的汉风格的单身示例

  我们可以看到,探针成员变量代表螺纹localrandprobe.memory part量的螺纹链接属性的内存迁移。

  您可以看到这三个属性确实在线程类中

  线程类:

  让我们看一下threadlocalrandom.current()方法。

  threadlocalrandom.current()

  threadlocalrandom.current()的作用主要是初始化随机种子和螺纹链球链球的返回实例。

  首先通过不安全类获取当前线程的螺纹列表属性,以查看是否已经初始化了随机种子。

  localinit()

  Localinit()方法的作用是初始化随机种子。您可以看到代码很简单。它是通过不安全类的当前螺纹Localrandprobe属性和螺纹链接的值。

  让我们以NextInt()方法为例,以查看如何生成螺纹链汇词到随机数中。我们可以看到随机数是通过NextSeed()方法获得的,然后通过随机种子生成的,然后重点介绍NextSeed()的重点()方法获取随机种子。

  NextSeed()

  Nexted()方法的作用是获得随机种子。代码非常简单。它是通过不安全类获取当前线程的螺纹量构成属性,并将原始螺纹链汇体设置为新的threadlocalrandomseed。

  概括:

  为什么螺纹链汇集线程安全?这是因为它将随机种子保存在当前螺纹对象的螺纹链汇体变量中,以便每个线程都有其自己的随机种子并实现线程级别的隔离。因此,随机种子的线安全性。在高平行场景中,效率将相对较高。

  注意:您是否发现螺纹列表保证线程的安全性与ThreadLocal有点相似?

  笔记:

  1. threadLocalrandom是一种情况。

  2.每个线程需要调用threadlocalrandom.current()以初始化当前线的随机种子。

  3.了解线程倾斜以了解不安全的类。这是Java提供的工具类,可以通过内存直接获得和修改变量。Java的CAS也通过此工具类实现。

  原始:“ https://juejin.cn/post/7096686984189444104”