JavaRush /Курсы /Java Multithreading /Разделяемые ресурсы, конфликты, проблема совместного дост...

Разделяемые ресурсы, конфликты, проблема совместного доступа

Java Multithreading
6 уровень , 3 лекция
Открыта
Разделяемые ресурсы, конфликты, проблема совместного доступа - 1

— Привет, Амиго! Хочу тебе рассказать о совместном использовании ресурсов. Разными нитями, ясное дело.

Я все время говорю о проблемах при работе нескольких нитей и о том, как их решать. Это не значит, что использование нитей – это плохо. Нити – это очень мощный инструмент. Фактически, они позволяют увеличить скорость, и даже надежность работы твоей программы. Чем сложнее программа – тем больше в ней нитей и различных самостоятельных частей.

Разбиение программы на независимые (слабосвязанные) части очень выгодно.

Представь, что твоя программа внутри разбита на 100 нитей. Но у тебя всего двухъядерный процессор. Это значит, что на каждом ядре исполняется в среднем 50 нитей.

Если же тебе нужно нарастить мощность программы, ты просто покупаешь двухпроцессорный сервер и пару крутых процессоров для него. В результате у него суммарно может быть до 32- ядер, и производительность твоей программы может вырасти в 2-20 раз. В зависимости от того, насколько действительно независимых частей она разбита.

Это одна из причин доминирования Java в секторе Enterprise-разработки. Если у компании есть сложная программа для внутренних нужд, которую пишут 20 разработчиков, то купить еще один сервер гораздо дешевле, чем ускорить программу в 2 раза.

— Так вот оказывается в чем дело.

— Но! Каждый раз, когда разработчик решает использовать еще одну нить, он решает одну проблему, а создает две. Слишком много нитей не увеличат производительность программы до бесконечности.

Во-первых, в любой программе есть работа, которую невозможно разбить на части и выполнять параллельно в разных нитях. Во-вторых, все нити выполняются на одном и том же процессоре. Чем больше нитей, тем медленнее работает каждая из них.

И, самое главное – нити часто используют одни и те же объекты (их обычно называют разделяемыми ресурсами).

Например, нить хочет сохранить в файл информацию о сделанной работе. Если таких нитей несколько, и они хотят записать информацию в один файл – они будут мешать друг другу. Чтобы в файле не было мешанины, каждая нить пользуется уникальным доступом к файлу – т.е. пока файлом пользуется одна нить, другие ждут.

— Да, я помню, это делается с помощью ключевого слова synchronized.

— Да, именно.

— А если нити пишут в разные файлы?

— Формально – это разные объекты, но жесткий диск же один.

— Т.е. реально что-то распараллелить можно только внутри процессора?

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

— И что же делать? Как узнать – делать много нитей или нет?

— Это определяется непосредственно архитектурой программы. У любого проекта есть его «архитектор», который знает все «ресурсы», которые используются в программе, знает их ограничения, и насколько они хорошо/плохо параллелятся.

— А если я не знаю?

— Тут есть два варианта:

а) поработать под началом такого специалиста

б) набить шишек самому

— Я – робот, у меня не бывает шишек – только вмятины.

— Ну, значит, набить вмятин.

— Ясно, спасибо. Ты прояснила некоторые вопросы, о которых я уже начал ломать голову.

Комментарии (67)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
I'll kick them all Уровень 5
24 августа 2025
Как-то неактуальненько. Сейчас все через сеть. Нужен новый поток? Подними лучше новый инстанс приложения. А синхронизация вообще через брокеры =)
Lafaed Уровень 36
10 апреля 2023
— Ясно, спасибо. Ты прояснила ровным счётом ничего!
very junior java developer Уровень 51
24 мая 2023
Зачем ты тут занимаешься??? ты практически под каждой лекцией/задачей пишешь что "плохо объяснили", "Ничего не понял", "условия не так написаны", "валидатор плохой", "задача говно, не парьтесь с ней, просто копируйте правильное решение" и т.д. и т.п. Зачем страдать? Брось это дело и всё.... Или же, всё что то ты пишешь это, не более чем, унылое позерство.
SergeyKPI Уровень 1
20 июля 2023
Вероятно, он - рецензент. :))))
Fl1s Уровень 51
7 августа 2023
Нубасик💀
26 марта 2024
Тебя это не касается, умник нашелся, указывает кому что делать 😂 это ты всех бесишь своими бесполезными коментами
very junior java developer Уровень 51
9 апреля 2024
Кого всех? Какими бесполезными коментами? Что за нападение?? Я задал логичный вопрос, челику, который практически на каждой странице оставил комментарий в духе «ничего не понял, сайт говно». Но его комменты тебе норм, а мой чем то сАгрил… или ты просто выделиться?
3 августа 2025
На 37 уровне ставки повышаются. Интриги, страсти, споры. Кто же выстоит и пройдет весь курс до конца? Об этом мы с вами потихоньку будем узнавать на следующих уровнях!
Дарья Уровень 1
7 апреля 2023
Обьясните пожалуйста, кто понял, про что тут говорится? "— Формально – это разные объекты, но жесткий диск же один. — Т.е. реально что-то распараллелить можно только внутри процессора? — Формально – Да, как только твоей нити надо что-то еще кроме данных, которые у нее есть, это что-то уже может быть занято другой нитью и придется ждать."
Gans Electro Уровень 4
6 июня 2023
Ну монитор у компьютера один, мышь одна, разъем для наушников одна. И диск часто один. Ты можешь конечно написать программу которая быстро работает для 50 мониторов одновременно, для 100 мышек одновременно и т.д. но в реале такого вообще не бывает. Твоя программа может иметь 100 потоков которые записывают в 100 разных файлов. Но диск у тебя один и винчестер у него один: Вики Фото Это по сути крутой граммофон который записывал иголкой и эта иголка всего одна (даже если больше) и в реальности все 100 файлов будут записываться последовательно по одному (если иголок больше то возможно по 2, 3, 4...). Кстати ядро внутри тоже разделено на части (L1, L2, L3, и др.). На плату можно крепить 2-4 или больше ОЗУ. А вот диска у тебя скорее всего будет не больше 2-х
8 марта 2024
Ядра процессора могут работать параллельно, независимо друг от друга, по крайней мере, пока они не лезут в общий кэш или ОЗУ. Но это все хотя бы быстро работает. А вот жесткий диск, или даже ssd, один на всех, и гораздо медленнее. Или сетевое подключение. Если множеству потоков надо к ним обратиться - они встанут в очередь, паралеллизма не будет. Такое можно распараллелить если дисков несколько и потоки пишут на разные диски (а может даже при этом работают на разных серверах), а потом кто-то один соберет все результаты воедино.
Kirill Уровень 46
18 октября 2024
В очередь они встанут только если их синхронизировать. В противном случае возникнет состояние гонки.
22 октября 2024
Вовсе не обязательно. Гонка будет только если потоки могут влиять на данные друг друга. А записывать 10 файлов в 10 потоков - никакой гонки не будет.
Denis Rogov Уровень 1 Expert
28 февраля 2023
Я так и не понял, на одном многоядерном процессоре использование нитей даёт преимущество в быстродействии или это ложная многопоточность?? То сначала сказали, что один проц может обслуживать только одну нить и поэтому при использовании нескольких нитей он будет по ним прыгать изображая многопоточность, то потом сказали что если у тебя 2-х ядерный проц и 100 нитей, то каждое ядро возьмёт (в среднем) по 50 нитей каждое. Смысл в итоге непонятен, как именно это работает под капотом.
Anonymous #3161756 Уровень 40
21 марта 2023
Все немного сложнее. Есть такой дядька - планировщик. Он собственно и распределяет каждую нить. Если нить не требует много ресурсов, из серии сделать расчет, вывести что-то, записать что-то, то высока вероятность, что он будет слать все на один процессор. Если же у тебя сложная обработка, то да планировщик будет распределять все по разным процессорам.
Gans Electro Уровень 4
6 июня 2023
В работе компьютера самый долгий это жесткие диски, ОЗУ быстрые, а процессор еще быстрее. Часто ОЗУ ждет диск, а проц ждет ОЗУ. За это время можно делать параллельно несколько работ. К тому же в лекциях говорили что даже если ядро одно можно и нужно писать потоки. Так как без этого одна нить делает 1 работу. То есть мы бы не могли одновременно смотреть Ютуб, слушать музыку, скачивать файл и загружать её и т.д. только одним потоком
Vkt Pra Уровень 30
26 февраля 2023
Элли, на пол шишечки, не изволитесЪ? 😉
Amberdance Уровень 41
10 января 2023
Набить пару шишек- это хорошо
Михаил Уровень 32
26 ноября 2022
отличные комментарии - Golang подняли. теперь воспаление жадности гарантировано!
Igor Petrashevsky Уровень 47
16 июня 2022
лучше всего проблема нитей решена в javascript
Bohdan Уровень 43
19 сентября 2022
Тонко подмечено 😅
Anonymous #2542465 Уровень 40
15 марта 2022
Вмятины - шишки внутрь.... А если волосы внутрь - дубленка....
Vitaly Vanda Уровень 35
1 сентября 2021
а) набить шишек самому б) поработать под началом такого специалиста, который тебе набьет шишек