Вы неправильно понимаете значение слова "потокобезопасный".
Когда мы говорим "класс X является потокобезопасным", мы не говорим, что вы не нужно беспокоиться о поточной безопасности программы, которая его использует. Если вы создаете программу с использованием ничего, кроме поточно-ориентированных объектов, это не гарантирует, что ваша программа будет поточно-ориентированной.
Так что же гарантирует это гарантирует?
Предположим, у вас есть List
. Предположим, что два потока, A и B, каждый записывает разные значения в один и тот же индекс в списке, предположим, что какой-то поток C читает из этого индекса, и предположим, что ни один из этих трех потоков не использует какую-либо синхронизацию.
Если список «потокобезопасен», то вы можете быть уверены, что поток C получит одно из трех возможных значений:
- Значение, которое записал поток A,
- Значение, которое записал поток B,
- Значение, которое хранилось по этому индексу до записи потока A или потока B.
Если список не потокобезопасный, тогда может произойти любая из тех же трех вещей, но могут произойти и другие вещи:
- Поток C может получить значение, которого никогда не было в списке,
- В будущем список может работать некорректно для потока C, даже если другой поток не будет его использовать,
- Программа может обработать sh,
- et c. (Я не знаю, сколько других странных вещей могло бы произойти.)
Когда мы говорим, что класс «потокобезопасен», мы говорим, что он всегда будет вести себя предсказуемо, разумно, даже когда его методы одновременно вызываются несколькими потоками.
Если вы пишете программу, использующую «потокобезопасный» список, и если это зависит от потока C, читая одно конкретное значение из трех возможностей, которые Я перечислил выше, тогда ваша программа имеет проблему с безопасностью потоков, хотя сам список не имеет.