¿Cómo implementar la inicialización diferida segura para subprocesos?

Cuáles son algunos enfoques recomendados para lograra salvo de amenaza inicialización perezosa? Por ejemplo

// Not thread-safe
public Foo getInstance(){
    if(INSTANCE == null){
        INSTANCE = new Foo();
    }

    return INSTANCE;
}