Are both the below approaches for lazy-initializing thread-safe singleton in java correct? Is there any performance difference? If not then why do we use the Holder pattern(Singleton2) instead of keeping it simple as in Singleton1 ?
Thanks in advance.
class Singleton1 {
    private Singleton1() {
        System.out.println("Singleton1-Constructor");
    }
    private static final Singleton1 inst1 = new Singleton1();
    public static Singleton1 getInst1() {
        return inst1;
    }
}
class Singleton2 {
    private Singleton2() {
        System.out.println("Singleton2-Constructor");
    }
    public static class Holder {
        private static final Singleton2 holderInst = new Singleton2();
    }
    public static Singleton2 getInst2() {
        return Holder.holderInst;
    }
}
public class App {
    public static void main(String[] args) {
        Singleton1.getInst1(); // without this statement the Singleton1 constructor doesnt get called.
        Singleton2.getInst2(); // without this statement the Singleton2 constructor doesnt get called.
    }
}
 
    