МВФ

  • 5
  • Недоступна
Singleton паттерн - синхронизация в методе. Класс IMF - это Международный Валютный Фонд. Внутри метода getFund создайте синхронизированный блок. Внутри синхронизированного блока инициализируйте поле imf так, чтобы метод getFund всегда возвращал один и тот же объект.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (136)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Sergey Kornilov
Уровень 35, Petropavlovsk, Казахстан
3 ноября 2021, 16:46
Всего эту задачу решили 26750 учеников.
Максим Глотов
Уровень 35, Новосибирск
17 августа 2021, 06:39
А в лекциях-то не объяснили, как весь класс замьютить! Вот и пишем тут всякое типа:
synchronized (imf = new IMF()) {}
Alikhan
Уровень 20, Grozny
16 сентября 2021, 10:36
Да и в видео каких-то такого не видел!
Valeriy
Уровень 30, Киев
3 ноября 2021, 12:49
мьютексом может быть любой инициализированный объект. Просто если несколько кусков кода синхронизированы по одному и тому же мьютексу, то нить занимающая данный мютекс блокирует весь код который по этому мютексу синхронизирован. например,
synchronized(new Object())
{
  // your code
}
тоже будет верным в этой задаче
Dolivo Serg
Уровень 28, Харьков
23 июля 2021, 21:07
Поспешил и ошибся с условием if (imf!=null), валидатор пропустил😁
Nick
Уровень 20
25 апреля 2021, 17:38
Чот 2 одинаковых задачи подряд.
Сергей Коваленко
Уровень 29, Краснодар
25 апреля 2021, 16:32
непонятно только для чего synchronized, что с ним, что без него вывод одинаковый, нитей нет.. Возможно как шаблон, для примера используется
Alena Palasionak
Уровень 37, Беларусь
23 марта 2021, 08:32
Поможет понять что должно быть в скобках synchronized(), что будет экраном : Читайте до конца
Евгений
Уровень 22, Москва
16 февраля 2021, 08:36
Так по жиденькому обошли вопрос с .class в прошлой лекции Чего это, куда это? Ищите сами.
Даниил Александрович
Уровень 35, Тамбов , Россия
1 февраля 2021, 11:13
прошлая задача где надо всего одно слово написать была помечена сложнее этой. я наверное странный
(imf == null) ? imf= new IMF() : imf
Kurama
Уровень 32, Киев, Украина
24 июня 2021, 13:55
newImf = newImf ==null? imf : newImf ; return newImf ; 😅тоже какое-то волшебство применил...
🦔 Виктор веду Java Android канал в telegram @LetsCodeIt Expert
19 января 2021, 19:11
1. Вспоминаем, что суть паттерна синглтона в том, что он позволяет создать лишь один экземпляр класса. 2. Поэтому внутри метода проверяем, если переменная МВФ НЕ равна null (то есть ещё не проинициализирована), то тогда создаём новый экземпляр и присваиваем его переменной. 3. Таким образом, при первом вызове метода класса МВФ он вернёт один единственный новый экземпляр. 4. Всё получится!
Skanta
Уровень 27, Ростов-на-Дону, Россия
21 января 2021, 13:56
Небольшая поправка: 2. Проверяем равна ли null наша переменная, потому что первым инициализируются статические переменные (она сразу будет null). Это небольшое занудство, ведь работает и так, и так, но так более понятнее будет для понимания.
Дмитрий
Уровень 18, Харьков
17 сентября 2021, 16:04
Почему то все равно не понимаю как это работает с проверкой, или без нее( Что так инициалируем, что так
🦔 Виктор веду Java Android канал в telegram @LetsCodeIt Expert
17 сентября 2021, 17:10
Смотрите, мы объявили в классе закрытую переменную, но НЕ проинициализировали её, т. е. ещё не создали объект. Чтобы экземпляр класса можно было получить извне (в другом классе), мы создали открытый метод, который возвращает объект. А чтобы исключить возможность получить несколько разных экземпляров класса, мы в этом методе поставили проверку, проинициализирована ли переменная, которую мы объявили в начале или нет. Если она ещё НЕ проинициализирована (== null), т. е. ещё не существует объекта, на который она ссылается, то тогда её инициализируем — создаём объект и тут же его возвращаем из метода тому, кто его вызвал, а переменная остаётся проинициализированной (объект уже создан и ссылка на него записана в переменную). Это означает, что если кто-то попробует вызвать метод ещё раз, то он точно получит тот же самый, один единственный созданный объект, потому что в методе сработает проверка, что переменная уже проинициализирована и в ней хранится ссылка на созданный объект. Это самая базовая реализация паттерна синглтон, которая позволяет возвращать всегда один и тот же экземпляр класса.
Дмитрий
Уровень 18, Харьков
18 сентября 2021, 11:02
Теперь уже гораздо лучше. Вопрос только, почему работает вот это
if (imf != null) {
            synchronized (imf) {
                imf = new IMF();
            }
        }
        return imf;
    }
Ведь если объект не null то повторное создание объекта ломает логику синглтона, или я чего то еще не понимаю
🦔 Виктор веду Java Android канал в telegram @LetsCodeIt Expert
18 сентября 2021, 14:51
Почему повторный вызов ломает логику? Как раз таки вся суть и логика синглтона в том, чтобы возвращать один и тот же объект при множественных вызовах. Т. е. при повторном вызове, если мы уже один раз проинициализировали объект, мы НЕ получим новый экземпляр класса, а получим первый, созданный ранее. В этом вся суть, чтобы не наплодить несколько экземпляров класса, а работать наверняка с одним и тем же. А на счёт synchronized процитирую Vitaly Khan, который ниже здесь в комментах прекрасно объяснил зачем он здесь (и в принципе) используется: «А synchronized используется, чтобы не случилось нежелательного проследования выполнения операций, когда разные потоки в рандомном порядке выполняют этот код одновременно. в нашем случае есть строка: if (null == imf) imf = new IMF(); она состоит из двух частей: проверки условия и создания объекта. если блок synchronized вокруг этого выражения отсутствует, то есть вероятность, что какой-то поток А успеет сделать проверку (пусть она получится true), а прежде чем поток А перейдет к созданию объекта IMF, другой поток вклинится и тоже проверит условие (у него, разумеется, тоже получится true). в итоге оба потока создадут два разных объекта, что недопустимо для нашей задачи».
Кирияк Максим
Уровень 26, Tiraspol, Молдова
13 января 2021, 10:22
Подскажите почему это работает вообще. Не знаю почему я так сделал. Когда сделал забыл свои мотивы. Но оно работает и я не могу понять почему.
public static IMF getFund() {
        //add your code here - добавь код тут
        if (imf != null) {
            synchronized (imf) {
                imf = new IMF();
            }
        }
        return imf;
    }
Даниил Александрович
Уровень 35, Тамбов , Россия
1 февраля 2021, 11:10
так как imf всего один раз равно null.
VasliyD
Уровень 22, Москва
28 февраля 2021, 16:33
Наверное, ты в прошлой жизни изобрёл ленивую инициализацию синглтонов, а сейчас вспомнил и сделал ))) На самом деле было же вроде в предыдущих лекциях где-то.
Антон
Уровень 22, иваново, Россия
3 мая 2021, 07:46
А работает это в смысле что пропустил валидатор? Если да, то мне тоже не понятно. Ведь по факту это же не синглотон, так как в данном случае никогда не создаётся новый объект (всегда будет возвращать null), если не был создан вне этого кода, либо всякий раз создавать новый объект, если был создан ранее.
Евгений
Уровень 23, Омск, Россия
1 июня 2021, 16:02
вот тут не пойму, если переменная не равна imf != null , то значит она уже ссылается на какой-то объект, и по условию его нужно вернуть из метода, а мы создаем новый объект класса и потом его возвращаем, скажите что я не так понимаю? )))