My opinion: If your class is thread security, there is no need to use the object pool, you can use the Singleton object, of course, if your object is created, each time the new creation is also available!
As for the use of the object pool, it is: 1. The object thread is not safe, and there can be only one thread access. 2. This object will be created frequently and create a more resource.
For example, a SERVLET Container, Request, Response, etc. (of course, the thread itself should also include the request) is obviously the thread is unsafe. If each call (for example, a GET or POST request) creates the corresponding object, obviously too much Wasting and inefficiency (often need to handle hundreds or even tens of thousands of requests per second), then use the object pool very suitable. For non-SingleThreadedModel's servlet, you can do not have to use the object pool (to more efficiently avoid repeatedly creation, the general servletcontainer will save a Singleton object reused)
Of course, there is an exception: If your thread is safe to monitor the object lock by keyword synchronized (that is, there may be a lock waiting during the call), using a single object may have a large performance problem (call Waiting for each other), then you may need to use the object pool or create an object each time.
If you say this, you will make static calculations. If you use only one instance in the system, and you will be Singleton, you will be safe.