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

Применение synchronized

Открыта
Применение 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.

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

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

Комментарии (54)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
I'll kick them allSenior Task Kicker в JavaTrush
24 августа 2025, 06:54
immutable object + final = thread safe reference на immutable object + setter + volatile/AtomicReference = thread safe.
Zim4ik
Уровень 1
22 июля 2025, 09:23
String — это не примитивный тип, а объект (ссылка на экземпляр класса java.lang.String)
25 апреля 2025, 12:03
— Пожалуйста. Надеюсь, эти советы помогут тебе, когда Диего даст тебе пару своих легких задач 😈
Илюха Будущий ЮниорJava - стажёр в ASTON
25 сентября 2024, 07:41
Как ты уже должен был запомнить, String (и все другие примитивные типы) является immutable. 🤯🤯🤯
safelogj Android Developer
6 августа 2024, 21:03
а я понял, предыдущие 3 лекции это занятый мьютекс, пока другой студент получает новые знания, я в цикле читаю одно и тоже из предыдущих лекций.
Алексей
Уровень 40
Expert
4 февраля 2024, 16:55
Все по делу)
Suzuya Jūzō
Уровень 46
25 апреля 2023, 17:12
❗уточнение: String (и все другие классы-оболочки примитивных типов) является immutable 💡примечание: Immutable означает, что каждый раз, когда значение объекта изменяется, то для него в стеке создается новая ссылка. Примитивные типы не хранят в себе ссылок, а хранят напрямую значение, которое просто заменяется новым при изменении, поэтому ни о каком immutable примивных типов и речи идти не может.
Дарья
Уровень 1
8 апреля 2023, 13:03
"String (и все другие примитивные типы) является immutable." Что за примитивные типы?
Lafaed
Уровень 36
12 апреля 2023, 09:58
Нейросеть
Уровень 41
19 сентября 2022, 09:45
"String (и все другие примитивные типы) является immutable" Я один не понял, когда String успел стать примитивным типом?
17 октября 2022, 16:04
Точно не уверен, но под примитивными типами скорее всего имелись ввиду классы-обертки (Integer, Double и тд)
Нейросеть
Уровень 41
17 октября 2022, 16:48
Да это оно и имелось ввиду. Вопрос мой был риторический шутки ради)
TemaCode
Уровень 51
29 ноября 2022, 12:10
тоже обратил внимание 😅👍 String явно не примитив)
Станислав Future
Уровень 39
15 июля 2022, 13:11
Диего, я иду ☺☺☺