JavaRush /Курсы /Java Multithreading /Применение synchronized

Применение synchronized

Java Multithreading
6 уровень , 7 лекция
Открыта
Применение synchronized - 1

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

— Да тут я, тут.

— Сегодня я расскажу тебе о практическом применении synchronized.

Когда в программе много объектов и нитей, то часто случаются ситуации, когда с одним объектом одновременно работает несколько нитей. Нити при этом мешают друг другу.

— Да, я это уже знаю.

— Так вот, допустим, у тебя есть объект, к которому обращаются несколько нитей. Чтобы с ним не было проблем можно сделать две вещи.

Первая – все места работы с данным объектом обернуть в блоки synchronized. Но такой подход может не сработать, если какой-то программист в своем коде будет обращаться к объекту напрямую, без блока synchronized.

Поэтому чаще всего применяется второй подход – объект делают нитебезопасным (thread-safe). Т.е. механизм synchronized встраивают в сам объект – объявляют его методы synchronized и/или оборачивают код внутри методов в блоки synchronized.

— Т.е все объекты, которые могут использоваться из разных нитей, а это почти все объекты программы, я должен сделать thread-safe?

— В общем-то, да. На самом деле не все объекты программы используются из разных нитей, но обычно много. Так что, когда ты начинаешь писать код своей нити и в ней обращаешься к различным объектам своей программы, то при вызове каждого метода, ты должен задуматься – а безопасен ли этот вызов?

— Безопасен?

— Безопасен (thread-safe) — это безопасен при вызове из разных нитей.

Вот тебе несколько примеров. Допустим, у тебя есть объект String, к которому происходит обращение из разных нитей. Как ты уже должен был запомнить, String (и все другие примитивные типы) является immutable. А это значит, что после создания объект не изменяется. А значит, и «сломать» такой объект нельзя. Все immutable объекты являются thread-safe.

— Уже легче.

— Теперь, допустим, тебе нужна изменяемая строка.

— Ага, помню. Есть две вида таких строк – StringBuffer и StringBuilder. StringBuffer – это аналог StringBuilder, но у него все методы синхронизированы. Он тоже является thread-safe?

— Да. Если тебе нужно обращаться к объекту StringBuilder из разных нитей, то нужно заменить его на StringBuffer, иначе рано или поздно нити будут менять его одновременно и «поломают».

— А если объект, к которому происходит обращение из разных нитей, – это объект моего собственного класса? Мне тоже надо добавлять к его методам synchronized?

— Да. Лучше всего руководствоваться таким правилом – все объекты, к которым происходит обращение из разных нитей, должны быть thread-safe.

— Ясно. Не думал, что все так серьезно. Спасибо, Элли.

— Пожалуйста. Надеюсь, эти советы помогут тебе, когда Диего даст тебе пару своих легких задач ☺

Комментарии (55)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
I'll kick them all Уровень 5
24 августа 2025
immutable object + final = thread safe reference на immutable object + setter + volatile/AtomicReference = thread safe.
Zim4ik Уровень 51
22 июля 2025
String — это не примитивный тип, а объект (ссылка на экземпляр класса java.lang.String)
25 апреля 2025
— Пожалуйста. Надеюсь, эти советы помогут тебе, когда Диего даст тебе пару своих легких задач 😈
25 сентября 2024
Как ты уже должен был запомнить, String (и все другие примитивные типы) является immutable. 🤯🤯🤯
safelogj Уровень 51
6 августа 2024
а я понял, предыдущие 3 лекции это занятый мьютекс, пока другой студент получает новые знания, я в цикле читаю одно и тоже из предыдущих лекций.
Алексей Уровень 40 Expert
4 февраля 2024
Все по делу)
Suzuya Jūzō Уровень 46
25 апреля 2023
уточнение: String (и все другие классы-оболочки примитивных типов) является immutable 💡примечание: Immutable означает, что каждый раз, когда значение объекта изменяется, то для него в стеке создается новая ссылка. Примитивные типы не хранят в себе ссылок, а хранят напрямую значение, которое просто заменяется новым при изменении, поэтому ни о каком immutable примивных типов и речи идти не может.
very junior java developer Уровень 51
24 мая 2023
☝☝☝ это важное уточнение. В лекции неточность/опечатка. Ибо примитивы не immutable, да и String не примитив.
Дарья Уровень 39
8 апреля 2023
"String (и все другие примитивные типы) является immutable." Что за примитивные типы?
Lafaed Уровень 36
12 апреля 2023
Нейросеть Уровень 41
19 сентября 2022
"String (и все другие примитивные типы) является immutable" Я один не понял, когда String успел стать примитивным типом?
17 октября 2022
Точно не уверен, но под примитивными типами скорее всего имелись ввиду классы-обертки (Integer, Double и тд)
Нейросеть Уровень 41
17 октября 2022
Да это оно и имелось ввиду. Вопрос мой был риторический шутки ради)
TemaCode Уровень 51
29 ноября 2022
тоже обратил внимание 😅👍 String явно не примитив)
Станислав Future Уровень 39
15 июля 2022
Диего, я иду ☺☺☺