笔者在多线程环境下用shuffle打乱List并随机取元素进行操作,测试通过后在生产环境发现取得的元素并不随机,排查后发现是shuffle方法中对list进行了重排,而笔者使用的数组并非线程安全类,以至于引发了线程安全问题。
问题分析:
1. 进行shuffle的数组是从配置中取出字符串用split裂解得到的数组,非线程安全

2. shuffle()方法会生成一个随机数并依照随机数对集合进行swap操作

解决方案:
1. 使用线程安全类
2. 在多线程下取随机元素更建议使用ThreadLocalRandom类的nextInt(List.Size())方法来生成随机下标取数据,相比较于shuffle的重排一定程度上能够节省性能
浙公网安备 33010602011771号