Does the ExecutorService guarantee thread safety ?
I'll be submitting jobs from different threads to the same ThreadPoolExecutor, do I have to synchronize access to the executor before interacting/submitting tasks?
Does the ExecutorService guarantee thread safety ?
I'll be submitting jobs from different threads to the same ThreadPoolExecutor, do I have to synchronize access to the executor before interacting/submitting tasks?
Your question is rather open-ended: All the ExecutorService
interface does is guarantee that some thread somewhere will process the submitted Runnable
or Callable
instance.
If the submitted Runnable
/ Callable
references a shared data structure that is accessible from other Runnable
/ Callable
s instances (potentially being processed simulataneously by different threads), then it is your responsibility to ensure thread safety across this data structure.
To answer the second part of your question, yes you will have access to the ThreadPoolExecutor before submitting any tasks; e.g.
BlockingQueue<Runnable> workQ = new LinkedBlockingQueue<Runnable>();
ExecutorService execService = new ThreadPoolExecutor(4, 4, 0L, TimeUnit.SECONDS, workQ);
...
execService.submit(new Callable(...));
EDIT
Based on Brian's comment and in case I've misunderstood your question: Submission of tasks from multiple producer threads to the ExecutorService
will typically be thread-safe (despite not being mentioned explicitly in the interface's API as far as I can tell). Any implementation that didn't offer thread safety would be useless in a multi-threaded environment (as multiple producers / multiple consumers is a fairly common paradigm), and this is specifically what ExecutorService
(and the rest of java.util.concurrent
) was designed for.
It's true, the JDK classes in question don't seem to make an explicit guarantee of thread-safe task submission. However, in practice, all ExecutorService implementations in the library are indeed thread-safe in this way. I think it's reasonable to depend on this. Since all the code implementing these features was placed in the public domain, there's absolutely no motivation for anyone to completely rewrite it a different way.
For ThreadPoolExecutor
the answer is simply yes. ExecutorService
does not mandate or otherwise guarantee that all implementations are thread-safe, and it cannot as it is an interface. These types of contracts are outside of the scope of a Java interface. However, ThreadPoolExecutor
both is and is clearly documented as being thread-safe. Moreover, ThreadPoolExecutor
manages it's job queue using java.util.concurrent.BlockingQueue
which is an interface that requests all implementations are thread-safe. Any java.util.concurrent.*
implementation of BlockingQueue
can be safely assumed to be thread-safe. Any non-standard implementation may not, although that would be outright silly if someone were to provide a BlockingQueue
implementing queue which was not thread-safe.
So the answer to your title question is clearly yes. The answer to the subsequent body of your question is probably, as there are some discrepancies between the two.