当前位置: 首页 > 面试题库 >

并发使用java.util.Random中的争用

齐成和
2023-03-14
问题内容

Oracle
Java文档
说:

java.util.Random的实例是线程安全的。但是,跨线程并发使用同一java.util.Random实例可能会引起争用并因此导致性能下降。考虑在多线程设计中改用ThreadLocalRandom。

表现不佳的原因可能是什么?


问题答案:

在内部,java.util.Random与当前种子保持AtomicLong,并且每当请求一个新的随机数时,就存在更新种子的争用。

从java.util.Random的实现中:

protected int next(int bits) {
    long oldseed, nextseed;
    AtomicLong seed = this.seed;
    do {
        oldseed = seed.get();
        nextseed = (oldseed * multiplier + addend) & mask;
    } while (!seed.compareAndSet(oldseed, nextseed));
    return (int)(nextseed >>> (48 - bits));
}

另一方面,ThreadLocalRandom通过每个线程有一个种子来确保种子更新而不会面临任何争用。



 类似资料:
  • 本文向大家介绍如何解决 Redis 的并发竞争 Key 问题?相关面试题,主要包含被问及如何解决 Redis 的并发竞争 Key 问题?时的应答技巧和注意事项,需要的朋友参考一下 所谓 Redis 的并发竞争 Key 的问题也就是多个系统同时对一个 key 进行操作,但是最后执行的顺序和我们期望的顺序不同,这样也就导致了结果的不同! 推荐一种方案:分布式锁(zookeeper 和 redis 都可

  • 问题内容: 两个问题: 我放入的每个种子都会得到不同的数字序列吗? 是否有一些“死”种子?(产生零或快速重复的那些。) 顺便说一句,我应该使用其他哪些PRNG? 解决方案:因为,我将要使用PRNG来制作游戏,所以我不需要它在密码上是安全的。我会选择梅森·Twister,因为它速度快而且时间长。 问题答案: 在某种程度上,随机数生成器是课程的主角。Random类使用合理选择的参数实现LCG。但是它仍

  • 本文向大家介绍使用DBMS中的锁进行并发控制,包括了使用DBMS中的锁进行并发控制的使用技巧和注意事项,需要的朋友参考一下 锁是维护DBMS中并发控制不可或缺的一部分。任何实现基于锁的并发控制的系统中的事务,在获得所需的锁之前都无法读取或写入语句。 基于锁的协议中有两种类型的锁。这些是: 二进制锁- 只能处于以下两种状态之一:锁定或解锁。 共享/独占锁- 仅执行读取操作时,将获取共享锁。共享锁可以

  • 我需要使用Jmeter对一个有100个并发用户的网站进行负载测试,我创建了这样的测试计划-

  • 我有一个动态的对等网络,节点与grpc进行通信。每个节点都有自己的服务器和客户端。定义了一种用于登录新节点的grpc方法。我使用同步消息将登录信息传达给所有其他服务器,在这里我与其他服务器创建一个新通道,发送一条消息并等待响应。 如果我的网络中有一个节点(节点1),然后两个或多个节点同时进入,例如节点2和节点3,它们将在节点1的服务器上同时调用grpc方法“enter”。对于这种类型的方法,nod

  • 写入进程应该用bytebuffer触发,它填充另一个线程 系统必须意识到写入或读取操作,因为其中任何一个操作都可能首先发生。 一种防止cpu无用运行的方法,当不需要时,OP_write会使cpu忙起来。 答: 正确使用OP_WRITE的方法如下: 如果该写返回零,则为OP_WRITE注册通道,保存您试图写入的ByteBuffer,并在通道上激发OP_WRITE时返回select循环,如果该写成功且