From b6031ad05d9e766d5a29520ca0ecb1f38281a084 Mon Sep 17 00:00:00 2001 From: Isaac Levy Date: Thu, 12 Sep 2024 14:26:09 -0400 Subject: [PATCH] Fix ThreadLocalRandom Current impl was not creating thread local randoms! --- lila/src/main/scala/Random.scala | 7 ++++++- lila/src/test/scala/RandomTest.scala | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 lila/src/test/scala/RandomTest.scala diff --git a/lila/src/main/scala/Random.scala b/lila/src/main/scala/Random.scala index 3ca0cea..dd61d60 100644 --- a/lila/src/main/scala/Random.scala +++ b/lila/src/main/scala/Random.scala @@ -2,7 +2,12 @@ package scalalib import scala.collection.mutable.StringBuilder -val ThreadLocalRandom = RandomApi(java.util.concurrent.ThreadLocalRandom.current) +import scala.collection.mutable.StringBuilder + +private final val store = + java.lang.ThreadLocal.withInitial(() => RandomApi(java.util.concurrent.ThreadLocalRandom.current)) + +def ThreadLocalRandom = store.get val SecureRandom = RandomApi(java.security.SecureRandom()) diff --git a/lila/src/test/scala/RandomTest.scala b/lila/src/test/scala/RandomTest.scala new file mode 100644 index 0000000..2b2095d --- /dev/null +++ b/lila/src/test/scala/RandomTest.scala @@ -0,0 +1,12 @@ +package scalalib + +class RandomTest extends munit.FunSuite: + + test("different threads get different randoms"): + val r1 = ThreadLocalRandom + + @volatile var r2: RandomApi = null + val thread2 = new Thread(() => r2 = ThreadLocalRandom) + thread2.start() + thread2.join() + assertNotEquals(r1, r2)