Is it possible to have one thread write to the
OutputStream of a Java
Socket, while another reads from the socket's
InputStream, without the threads having to synchronize on the socket?
Sure. The exact situation you're describing shouldn't be a problem (reading and writing simultaneously).
Generally, the reading thread will block if there's nothing to read, and might timeout on the read operation if you've got a timeout specified.
Since the input stream and the output stream are separate objects within the Socket, the only thing you might concern yourself with is, what happens if you had 2 threads trying to read or write (two threads, same input/output stream) at the same time? The read/write methods of the InputStream/OutputStream classes are not synchronized. It is possible, however, that if you're using a sub-class of InputStream/OutputStream, that the reading/writing methods you're calling are synchronized. You can check the javadoc for whatever class/methods you're calling, and find that out pretty quick.
Yes, that's safe.
If you wanted more than one thread reading from the InputStream you would have to be more careful (assuming you are reading more than one byte at a time).
At times like this I find it best to go look at the source code:
From the code you can see as mention by others an InputStream and OutputStream are created those maintain their own state, so you should be fine with both reading/writing with two threads.
However as mentioned earlier you can clearly tell its a bad idea to have two threads reading from the same input stream (the eof is not synchronized).
Per @SoftwareMonkey's inferred suggestion it might be best to also post this question to an official Java (Oracle) forum as to what the correct contract is.