Ад нет .Если это не задокументировано как потокобезопасное, мы не будем это предполагать.Не берите в голову рекомендации Sun, написанные во времена Vector, Hashtable, StringBuffer, старой модели памяти Java и однопроцессорных машин.Мода перевернулась.Мы живем в совершенно другом мире java-параллелизма.
Для изменчивого класса гораздо более вероятно, что он написан с одной мыслью.Так что я бы сказал, что без документации нам придется предполагать, что это для одного потока. Внешняя синхронизация должна использоваться в более широкой картине вещей.(Это обычно помогает повысить производительность по сравнению с блокировкой на более тонком уровне).
Для класса, который фактически предназначен для использования в нескольких потоках, он должен предоставить кропотливо подробный документ о том, как он ведет себя.Это нонсенс , чтобы пометить его как просто "потокобезопасный".Слишком много вещей, которые можно объяснить и задокументировать, проверить любой класс параллелизма.
Поэтому бессмысленно предполагать режим безопасности потока по умолчанию.Это ничего не значит.
-
Для вашего конкретного запроса, если реализация такая:
constructor()
open socket
Response call(Request)
write request to socket output stream
read response from socket input stream
close()
close socket
Без синхронизации по call (), этоочевидно небезопасно.Если у вас есть параллельное чтение / запись по TCP-соединению, хаос гарантирован.
Предположим, я написал более безопасную реализацию, буду ли я молчать?Конечно, нет.Я скажу пользователю, что одновременные вызовы разрешены;каждый запрос написан атомарно;трубопровод используется для пропускной способности;ответы возвращаются в порядке запросов;close () может быть вызван в любое время любым потоком;ожидающие звонки будут иметь х секунд, чтобы закончить изящно;после этого соединение прерывается;любой поток, ожидающий вызова (), получит исключение.