oldratlee / translations

🐼 Chinese translations for classic software development resources
https://github.com/oldratlee/translations
Other
6.86k stars 1.56k forks source link

随机的int有问题 #68

Closed oweson closed 4 years ago

oweson commented 4 years ago

这条其实是一个迷题,先不要看解答。看看你能不能自己找出解法。

运行下面的代码:

for (int i = 0; i < 10; i++) {
    System.out.println((Integer) i);
}

…… 然后要得到类似下面的输出(每次输出是随机结果):

92
221
45
48
236
183
39
193
33
84

Output:

0
1
2
3
4
5
6
7
8
9
cmonkey commented 4 years ago

直接运行上面的代码当然不会出问题,关键在于在完整实现中,通过反射调用Integer#IntegerCache 对cache 中的数据进行了随机篡改,最后才导致读取cache 中的值不符合未修改cache 时的预期

在jdk 8 版本上,编译和运行都不会告警,但在高版本的jdk 上在编译阶段就会警告,比如在jdk 13 上就会警告说对IntegerCache 的反射不合法,在未来此api 可能会被删除

oldratlee commented 4 years ago

@oweson

如 @cmonkey 所言,这是个谜题,

要你写出解法(即,关键在于在完整实现中,通过反射调用Integer#IntegerCachecache中的数据进行了随机篡改,最后才导致读取cache 中的值不符合未修改cache 时的预期),

让上面的代码运行成 随机的。