Hell No. If it's not specifically documented as thread safe, we shall not assume that. Don't mind Sun's recommendation written in the days of Vector, Hashtable, StringBuffer, old java memory model and single processor machines. The fashion has turned. We are living in a dramatically different world of java concurrency.
For a mutable class, it's far more likely that it's written with one thread in mind. So I would argue that without doc we'll have to assume it's for single thread. External synchronization must be used in a bigger picture of things. (That usually helps performance compared to locking at finer level).
For a class that's actually designed to be used in multiple threads, it must provide painstakingly detailed document of how it behaves. It is nonsense to mark it as simply "thread safe". There are too many things to explain and document, check out any concurrency class.
Therefore, it is nonsense to assume a "default" thread safety mode. It doesn't mean anything.
--
For you specific query, if the implementation is like this
constructor()
open socket
Response call(Request)
write request to socket output stream
read response from socket input stream
close()
close socket
Without synchronization on call(), this is obviously UNSAFE. If you have concurrent reads/writes on a TCP connection, chaos assured.
Suppose I wrote a safer implementation, would I keep silent? Of course not. I'll tell the user that concurrent call()s are allowed; each request is written atomically; pipeline is used for throughput; responses are returned in the order of requests; close() can be invoked anytime by any thread; outstanding calls will have x seconds to finish gracefully; after that the connection is aborted; any thread waiting on call() will receive an excpetion.