Единственная гарантия, которую вы имеете, состоит в том, что отправленный байт отправляется один раз, а чтение байта читается один раз. Другие могут сказать, что о синхронизации заботится библиотека времени выполнения или основная операционная система. Любое такое утверждение зависит от реализации во время выполнения и / или от операционной системы (и, на мой взгляд, должно игнорироваться).
Итак, если у вас есть один поток, читающий из сокета, и один поток, записывающий в сокет, у вас все будет в порядке без синхронизации.
Если более чем один поток может записать в сокет, вы должны синхронизировать их действия, чтобы убедиться, что выходные данные, отправленные из двух потоков, не чередуются.
То же самое относится, если два потока читают из сокета. Вы должны синхронизировать чтения, чтобы убедиться, что данные, прочитанные одним потоком, не имеют «пробелов» из-за чтения другого потока.
Аналогичный вопрос, тот же вывод: