JavaRush /Курсы /Java Core /Даешь synchronized! Практическая версия

Даешь synchronized! Практическая версия

Java Core
7 уровень , 4 лекция
Открыта

— Привет, Амиго!

9
Задача
Java Core, 7 уровень, 4 лекция
Недоступна
Синхронизированные заметки
1. Класс Note будет использоваться нитями. Поэтому сделай так, чтобы обращения к листу notes блокировали мьютекс notes, не this 2. Все System.out.println не должны быть заблокированы (синхронизированы), т.е. не должны находиться в блоке synchronized
5
Задача
Java Core, 7 уровень, 4 лекция
Недоступна
Синхронизированные заметки 2
Класс Note будет использоваться нитями. Поэтому сделай так, чтобы вcе методы были синхронизированы
9
Задача
Java Core, 7 уровень, 4 лекция
Недоступна
Сад-огород
1. Создай метод public void addFruit(int index, String fruit) - который добавляет параметр fruit в лист fruits на позицию index. 2. Создай метод public void removeFruit(int index) - который удаляет из fruits элемент с индексом index. 3. Создай метод public void addVegetable(int index, String vegetable)
9
Задача
Java Core, 7 уровень, 4 лекция
Недоступна
Синхронизированный президент
И снова Singleton паттерн - синхронизация в статическом блоке. Внутри класса OurPresident в статическом блоке создайте синхронизированный блок. Внутри синхронизированного блока инициализируйте president.
5
Задача
Java Core, 7 уровень, 4 лекция
Недоступна
МВФ
Singleton паттерн - синхронизация в методе. Класс IMF - это Международный Валютный Фонд. Внутри метода getFund создайте синхронизированный блок. Внутри синхронизированного блока инициализируйте поле imf так, чтобы метод getFund всегда возвращал один и тот же объект.
Комментарии (246)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
17 января 2025
Всем привет! Не могу дотумкать что не так в моих решениях в последних двух задачах Подскажите/намекните плз )

    public static class OurPresident {
        private static OurPresident president;

        private OurPresident() {
        }
        static {
            synchronized (OurPresident.class) {
                president = new OurPresident();
            }
        }
        
        public static OurPresident getOurPresident() {
            return president;
        }
    }
Метод getFund() должен содержать синхронизированный блок. - но блок есть .. Внутри синхронизированного блока должно быть проинициализировано поле imf. - но поле проинициализировано ... и

    public static class IMF {
        private static IMF imf;
        private IMF() {
        }
        
        public static IMF getFund() {
            synchronized (IMF.class) {
                imf = new IMF();
            }
            return imf;
        }
    }
Класс OurPresident должен содержать статический блок. - класс содержит блок ... Внутри статического блока класса OurPresident должен быть синхронизированный блок. - блок присутствует ... Внутри синхронизированного блока должно быть проинициализировано поле president. - поле проинициализировано ... Заранее спасибо!
21 января 2025
Привет, в обоих случаях нужно присваивать полям значения единожды (только если поле = null). Иначе ничего делать не нужно.
ВК Уровень 36
10 декабря 2024
Поною на валидатор. Задача "Синхронизированный президент". Мой код:

public class OurPresident {
    private static OurPresident president;
    private static Boolean b;
    
    static {
        synchronized(b) {
            president = new OurPresident();
        }        
    }

    private OurPresident() {
    }

    public static OurPresident getOurPresident() {
        return president;
    }
}
Мой код удовлетворяет всем озвученным требованиям задачи, значит его или следовало принять, или сказать, какой именно объект предлагается использовать в качестве мьютексного.
25 февраля 2025
ты забыл добавить проверку на null
Viacheslav Уровень 22
1 ноября 2024
Не понимаю, какой объект надо передавать в блок synchronized в этом примере? Почему именно notes? Если я передам туда this ничего же не изменится. Вообще зачем в этот блок что-то передавать, какой в этом смысл? Поток заходит в блок, остальные ждут - тут все ясно. Зачем объект передавать?

public void addNote(int index, String note) {
    System.out.println("Сейчас будет добавлена заметка [" + note + "] На позицию " + index);
    synchronized (notes) {
        notes.add(index, note);
    }
    System.out.println("Уже добавлена заметка [" + note + "]");
}
Віктор Уровень 17
2 ноября 2024
насколько я понимаю проблема будет в том что массив notes объявлен как финальный и будет один и тем же для всех this (объектов). Поэтому если будет доступ с разных потоков то практически будет добавлятся и удаляться элементы с одними и теми же индесами что будет приводить к оибкам а когда мы блокируем сам массив, то сначала один поток сможет добавить или удалить, а затем только лишь другой что будет корректно увеличивать или уменьшать наш массив
Jsuccess Уровень 30
30 ноября 2024
Фактически, ты можешь и синхронизировать объект this, можешь вообще полностью синхронизировать метод, разница будет невелика, поэтому любой из этих вариантов правилен.
{Java_Shark} Уровень 36
30 октября 2024
++
Леонид Уровень 12
10 августа 2024
Мьютексы (или мьютексы, от английского "mutex" — "mutual exclusion") в Java используются для управления доступом к общим ресурсам между несколькими потоками. Подумай о мьютексе как о замке на ресурсе. Когда один поток "закрывает" замок (или "захватывает" мьютекс), другие потоки не могут получить доступ к этому ресурсу, пока замок не будет "открыт" (или "освобожден"). Простой пример: Представь, что у тебя есть один стол с одним компьютером, и несколько человек хотят использовать его одновременно. Чтобы избежать конфликтов и путаницы, ты устанавливаешь расписание или правила, чтобы только один человек мог пользоваться компьютером в любой момент времени. Мьютекс в этом случае — это правило, которое обеспечивает, чтобы только один человек мог использовать компьютер в одно время.

public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;  // Этот метод будет выполняться только одним потоком за раз
    }

    public synchronized int getCount() {
        return count;  // Этот метод тоже будет выполняться только одним потоком за раз
    }
}

В этом примере: Метод increment и метод getCount синхронизированы. Это значит, что если один поток выполняет increment, другой поток не может одновременно выполнять этот метод или getCount до тех пор, пока первый поток не завершит выполнение и не освободит замок.
David Dzhikia Уровень 29 Expert
6 июня 2024
Как по маслу проехался, даже глазом не моргнул! Рекомендую подробнее знакомиться с каждой темой, смотреть на ютубе уроки к примеру. Так все будет понятней, а задачи будут приносить удовольствие, вместо ощущения своей неполноценности.
Артём Уровень 28 Expert
22 мая 2024
Рекомендую потратить пять минут на установку расширения с переводчиком в браузер, если не дружите с английским и понять разницу между Object level locking и Class level locking https://stackoverflow.com/questions/3718148/java-class-level-lock-vs-object-level-lock По ссылке все наглядно, с примерами. Если своими словами, то при блокировке на уровне объекта synchronized (this), synchronized (objName) или synchronized в сигнатуре метода вы ставите мьютекс "занято" только на этот объект, но другие объекты этого класса по-прежнему могут использовать код из блока (метода) в то же время в соседних потоках. В то время, как при блокировке на уровне класса synchronized (MyClass.class) из всех созданных экземпляров класса только один сможет использовать синхронизированный код. После того, как написал звучит очевидно, но хотелось просто сформулировать это, чтобы не забыть.)
Евгений Уровень 51
23 мая 2024
хорошее замечание. В этом блоге (лекции) https://javarush.com/groups/posts/1055-sinkhronizacija-potokov-blokirovka-obhhekta-i-blokirovka-klassa п.7 в конце тоже в эту же тему. То есть если необходимо синхронизировать все потоки в одном месте, то для синхронизации нужно выбирать неизменяемое поле (Final со ссылкой на объект) или объект, который существует в единственном экземпляре.
Private Joker Уровень 36
14 мая 2024
странные "задачи" если честно. Смысл их непонятен.
Kiberdronik Уровень 32
12 мая 2024
12.05.2024
Saf Уровень 36
6 мая 2024
Очень даже все понятно, пока. Это радует! Идем дальше!