Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
db9b00b4
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
db9b00b4
编写于
5月 09, 2010
作者:
M
martin
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
6937857: Concurrent calls to new Random() not random enough
Summary: seed uniquifier should use an independent PRNG Reviewed-by: dl
上级
6c26198a
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
61 addition
and
8 deletion
+61
-8
src/share/classes/java/util/Random.java
src/share/classes/java/util/Random.java
+23
-6
test/java/util/Random/DistinctSeeds.java
test/java/util/Random/DistinctSeeds.java
+38
-2
未找到文件。
src/share/classes/java/util/Random.java
浏览文件 @
db9b00b4
...
...
@@ -86,8 +86,23 @@ class Random implements java.io.Serializable {
* the seed of the random number generator to a value very likely
* to be distinct from any other invocation of this constructor.
*/
public
Random
()
{
this
(++
seedUniquifier
+
System
.
nanoTime
());
}
private
static
volatile
long
seedUniquifier
=
8682522807148012L
;
public
Random
()
{
this
(
seedUniquifier
()
^
System
.
nanoTime
());
}
private
static
long
seedUniquifier
()
{
// L'Ecuyer, "Tables of Linear Congruential Generators of
// Different Sizes and Good Lattice Structure", 1999
for
(;;)
{
long
current
=
seedUniquifier
.
get
();
long
next
=
current
*
181783497276652981L
;
if
(
seedUniquifier
.
compareAndSet
(
current
,
next
))
return
next
;
}
}
private
static
final
AtomicLong
seedUniquifier
=
new
AtomicLong
(
8682522807148012L
);
/**
* Creates a new random number generator using a single {@code long} seed.
...
...
@@ -103,8 +118,11 @@ class Random implements java.io.Serializable {
* @see #setSeed(long)
*/
public
Random
(
long
seed
)
{
this
.
seed
=
new
AtomicLong
(
0L
);
setSeed
(
seed
);
this
.
seed
=
new
AtomicLong
(
initialScramble
(
seed
));
}
private
static
long
initialScramble
(
long
seed
)
{
return
(
seed
^
multiplier
)
&
mask
;
}
/**
...
...
@@ -127,8 +145,7 @@ class Random implements java.io.Serializable {
* @param seed the initial seed
*/
synchronized
public
void
setSeed
(
long
seed
)
{
seed
=
(
seed
^
multiplier
)
&
mask
;
this
.
seed
.
set
(
seed
);
this
.
seed
.
set
(
initialScramble
(
seed
));
haveNextNextGaussian
=
false
;
}
...
...
test/java/util/Random/DistinctSeeds.java
浏览文件 @
db9b00b4
...
...
@@ -33,18 +33,54 @@
/*
* @test
* @bug 4949279
* @bug 4949279
6937857
* @summary Independent instantiations of Random() have distinct seeds.
*/
import
java.util.ArrayList
;
import
java.util.HashSet
;
import
java.util.List
;
import
java.util.Random
;
public
class
DistinctSeeds
{
public
static
void
main
(
String
[]
args
)
throws
Exception
{
// Strictly speaking, it is possible for these to randomly fail,
// but the probability should be
*extremely* small (< 2**-63
).
// but the probability should be
small (approximately 2**-48
).
if
(
new
Random
().
nextLong
()
==
new
Random
().
nextLong
()
||
new
Random
().
nextLong
()
==
new
Random
().
nextLong
())
throw
new
RuntimeException
(
"Random() seeds not unique."
);
// Now try generating seeds concurrently
class
RandomCollector
implements
Runnable
{
long
[]
randoms
=
new
long
[
1
<<
17
];
public
void
run
()
{
for
(
int
i
=
0
;
i
<
randoms
.
length
;
i
++)
randoms
[
i
]
=
new
Random
().
nextLong
();
}
}
final
int
threadCount
=
2
;
List
<
RandomCollector
>
collectors
=
new
ArrayList
<
RandomCollector
>();
List
<
Thread
>
threads
=
new
ArrayList
<
Thread
>();
for
(
int
i
=
0
;
i
<
threadCount
;
i
++)
{
RandomCollector
r
=
new
RandomCollector
();
collectors
.
add
(
r
);
threads
.
add
(
new
Thread
(
r
));
}
for
(
Thread
thread
:
threads
)
thread
.
start
();
for
(
Thread
thread
:
threads
)
thread
.
join
();
int
collisions
=
0
;
HashSet
<
Long
>
s
=
new
HashSet
<
Long
>();
for
(
RandomCollector
r
:
collectors
)
{
for
(
long
x
:
r
.
randoms
)
{
if
(
s
.
contains
(
x
))
collisions
++;
s
.
add
(
x
);
}
}
System
.
out
.
printf
(
"collisions=%d%n"
,
collisions
);
if
(
collisions
>
10
)
throw
new
Error
(
"too many collisions"
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录