@nedarwin1217 Данные берутся из одного списка? Может просто одновременное взятие в разных потоках? Это многие забывают учитывать.
Лично я делал проверку на использование списком. Логика простая: когда один поток берёт что-то из списка, он записывает в текстовый файл идентификатор, например 1, после окончания взятия данных и удаления их ставит в текстовик, например, 0. Другие потоки сперва проверяют этот текстовик и если там стоит 1, то ждут появления записи 0. И всё же при большом кол-ве потоков вероятность захода разных потоков в один файл высок, так что лучше использовать сон, можно рандомный.