笔者在多线程环境下用shuffle打乱List并随机取元素进行操作,测试通过后在生产环境发现取得的元素并不随机,排查后发现是shuffle方法中对list进行了重排,而笔者使用的数组并非线程安全类,以至于引发了线程安全问题。

问题分析:

  1. 进行shuffle的数组是从配置中取出字符串用split裂解得到的数组,非线程安全

  

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

  

 

 

 

解决方案:

  1. 使用线程安全类

  2. 在多线程下取随机元素更建议使用ThreadLocalRandom类的nextInt(List.Size())方法来生成随机下标取数据,相比较于shuffle的重排一定程度上能够节省性能

 

 

   

posted on 2020-11-28 10:23  谁戳破我轮胎  阅读(591)  评论(0)    收藏  举报