Singleton with a volatile and synchronized instance
The memory model of the jvm doesn't allow double checked locking like that to work like you think it does. The jvm is allowed to assign the object before running the constructor.



In java class loading is already lazy and perfectly thread safe. So the naive 

private static final ExecutorServiceSingleton instance = new ExecutorServiceSingleton();


is fine for most purposes.

If you really want the lazy ness to go further then something like: 

private static class Nested{
    private static final ExecutorServiceSingleton instance = new ExecutorServiceSingleton();
}

public static ExecutorServiceSingleton getInstance() {

    return Nested.instance;
}


will do what you need.