МВФ

  • 5
  • Недоступна
Singleton паттерн - синхронизация в методе. Класс IMF - это Международный Валютный Фонд. Внутри метода getFund создайте синхронизированный блок. Внутри синхронизированного блока инициализируйте поле imf так, чтобы метод getFund всегда возвращал один и тот же объект.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (127)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Dolivo Serg
Уровень 18, Харьков
23 июля, 21:07
Поспешил и ошибся с условием if (imf!=null), валидатор пропустил😁
Nick
Уровень 20
25 апреля, 17:38
Чот 2 одинаковых задачи подряд.
Сергей Коваленко
Уровень 33, Краснодар, Россия
25 апреля, 16:32
непонятно только для чего synchronized, что с ним, что без него вывод одинаковый, нитей нет.. Возможно как шаблон, для примера используется
Alena Palasionak
Уровень 25, Беларусь
23 марта, 08:32
Поможет понять что должно быть в скобках synchronized(), что будет экраном : Читайте до конца
Евгений
Уровень 22, Москва
16 февраля, 08:36
Так по жиденькому обошли вопрос с .class в прошлой лекции Чего это, куда это? Ищите сами.
Даниил Александрович
Уровень 35, Тамбов , Россия
1 февраля, 11:13
прошлая задача где надо всего одно слово написать была помечена сложнее этой. я наверное странный
(imf == null) ? imf= new IMF() : imf
Kurama
Уровень 32, Киев, Украина
24 июня, 13:55
newImf = newImf ==null? imf : newImf ; return newImf ; 😅тоже какое-то волшебство применил...
🦔 Виктор веду Java Android канал в telegram @LetsCodeIt Expert
19 января, 19:11
1. Вспоминаем, что суть паттерна синглтона в том, что он позволяет создать лишь один экземпляр класса. 2. Поэтому внутри метода проверяем, если переменная МВФ НЕ равна null (то есть ещё не проинициализирована), то тогда создаём новый экземпляр и присваиваем его переменной. 3. Таким образом, при первом вызове метода класса МВФ он вернёт один единственный новый экземпляр. 4. Всё получится!
Skanta
Уровень 23, Ростов-на-Дону, Россия
21 января, 13:56
Небольшая поправка: 2. Проверяем равна ли null наша переменная, потому что первым инициализируются статические переменные (она сразу будет null). Это небольшое занудство, ведь работает и так, и так, но так более понятнее будет для понимания.
Кирияк Максим
Уровень 26, Tiraspol, Молдова
13 января, 10:22
Подскажите почему это работает вообще. Не знаю почему я так сделал. Когда сделал забыл свои мотивы. Но оно работает и я не могу понять почему.
public static IMF getFund() {
        //add your code here - добавь код тут
        if (imf != null) {
            synchronized (imf) {
                imf = new IMF();
            }
        }
        return imf;
    }
Даниил Александрович
Уровень 35, Тамбов , Россия
1 февраля, 11:10
так как imf всего один раз равно null.
VasliyD
Уровень 22, Москва
28 февраля, 16:33
Наверное, ты в прошлой жизни изобрёл ленивую инициализацию синглтонов, а сейчас вспомнил и сделал ))) На самом деле было же вроде в предыдущих лекциях где-то.
Антон
Уровень 20, иваново, Россия
3 мая, 07:46
А работает это в смысле что пропустил валидатор? Если да, то мне тоже не понятно. Ведь по факту это же не синглотон, так как в данном случае никогда не создаётся новый объект (всегда будет возвращать null), если не был создан вне этого кода, либо всякий раз создавать новый объект, если был создан ранее.
Евгений
Уровень 23, Омск, Россия
1 июня, 16:02
вот тут не пойму, если переменная не равна imf != null , то значит она уже ссылается на какой-то объект, и по условию его нужно вернуть из метода, а мы создаем новый объект класса и потом его возвращаем, скажите что я не так понимаю? )))
Vladimir Shevchenko
Уровень 25, Днепр
2 ноября 2020, 22:45
Подскажите почему не пропускает synchronized(this){...???а только IMF.class?
Evgeny Siganov
Уровень 28, Москва
3 ноября 2020, 10:58
потому что метод getFound статический и он не привязан к объекту класса. Соответственно он привязан к классу IMF.class
canny
Уровень 27, Россия
25 сентября 2020, 04:19
if (imf == null) synchronized (imf = new IMF()) {}
всё.
Иван
Уровень 31, Рязань, Россия
12 октября 2020, 18:34
как так легко? вообще не понятно почему так.... коммент очень помог
Евгений
Уровень 20, Краснодар, Россия
24 октября 2020, 15:49
В synchronized должен передаваться объект. В "synchronized (imf = new IMF())" выполняется сразу несколько действий. И создание объекта и присвоение его imf, и передача объекта в synchronized
aleksdenni
Уровень 22, Полтава, Украина
30 октября 2020, 23:47
synchronized (IMF.class) { if (imf == null) { imf = new IMF(); } } Не знал что можно так ))
Druha
Уровень 28
6 ноября 2020, 19:33
тоже так решил , т.к. synchronized сильно замедляет, то решил его вставить после if
Артур Прохоренко
Уровень 28, Гомель, Белоруссия
7 ноября 2020, 09:34
Объясни пожалуйста, что будет, если много потоков обратится к getFund(), я так понимаю, что они все попадут в условие на проверку равенства imf == null, пройдут его и далее все кроме одного зависнут, этот один пройдет и создаст объект, а следом каждый из потоков сделает так же. Т.е. объекты будут пересозданы более 1 раза и это уже не Singleton. Или я не правильно понимаю логику работы предложенного выражения? Попробовал с пятью нитями, так как ты предложил - все работает, все true. Почему - не понимаю...? Спасибо!