помогите, пожалуйста решил две однотипные задачи - в чем их суть? №1
public class OurPresident {
    private static OurPresident president;

    static {
        synchronized (OurPresident.class) {
            president = new OurPresident();
        }
    }

    private OurPresident() {
    }

    public static OurPresident getOurPresident() {
        return president;
    }
}
№ 2
public class IMF {

    private static IMF imf;

    public static IMF getFund() {
        //add your code here - добавь код тут
        synchronized (IMF.class){
            if(imf == null) {
                imf = new IMF();
            }
        }
        return imf;
    }

    private IMF() {
    }
}
насколько я понял, первая задача не реализует паттерн Singleton, потому что есть возможность создать другой объект, а во второй задачи создается и выводится только один объект - это я про проверку
if(imf == null) {
    imf = new IMF();
}
правильно ли понимаю? если ошибаюсь и первая задача все-таки реализует паттерн Singleton, то какой из этих двух способов записи правильный? то есть где нужно инициализировать private static переменную - в блоке static или в методе public static *** get***() {} , где *** - имя класса