The stub and channel are thread safe meaning many threads can use these objects to begin RPCs safely.
For streaming RPCs, you'll have to pass in a StreamObserver and get back a StreamObserver. They are not thread safe because they contain unsynchronized code and data. For example, there is a flag that is set true if "cancel" is called, and will throw an error if you ever send a message after calling "cancel".
As long as the StreamObservers do not interact across threads you are fine. If you do, you must add synchronization at the application level.