Вопрос: Как написать потокобезопасный класс, чтобы не надо было заниматься синхронизацией? — КиберПедия 

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Вопрос: Как написать потокобезопасный класс, чтобы не надо было заниматься синхронизацией?

2022-10-10 39
Вопрос: Как написать потокобезопасный класс, чтобы не надо было заниматься синхронизацией? 0.00 из 5.00 0 оценок
Заказать работу

Ответ: Stringпотокобезопасный? Да. Открываете документацию. Те, кто является потокобезопасным классом написано – thread-safe. Почему? Он неизменяемый. У него есть данные? Да, но они не изменяемы.

Если вы напишете свой собственный класс неизменяемым, то он потокобезопасный. Обертки Integer, Double– они все потокобезопасны. Вот раз вариант.

Второй вариант смешной, но очень активно используется. Данных нет вообще, как членов класса. Это один из способов написания объектов в технологии EnterpricejavaBeans. Там есть состояния и есть такое понятие, как Stateless. А если он работает в многопотоковом окружении, к нему там 1000 потоков обращается, и я хочу, чтобы он просто дирижировал «пришел запрос? туда, пришел запрос? туда». У него будет 10 функций, а мне будут передавать запросы. Зачем ему данные? Зачем они ему нужны? Не нужны. Все. Нет данных – нет проблем. Предыдущий слайд. ThreadLocal. Не нужна синхронизация.

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

Посмотрели они (разработчики) на нас, спросили нас, сколько мы занимаемся многопоточным программированием. Мы ответили "ноль". И они сказали «ладно, мы сделаем вам все готовое». Если начать как в Си (native-code), когда вы используете специальные объекты ОС, и говорим «ты, следи за этим, а я буду смотреть туда и т.д.» - это нужно книжку прочитать. И потом еще, хорошо попрактиковаться. Поэтому они говорят «ну все-таки Java – это современный стиль. Давайте мы сделаем людям доброе дело. Создадим одно слово – synchronized. И все будет потокобезопасным». Слово synchronized что защищает? Где его пишут? Он не является модификатором у переменной. Ни в коем случае. Он пишется перед блоком кода. Ну функция – это тоже блок кода, правильно? У вас два выбора написать:

· либо перед блоком кода целиком – у функции

· либо перед блоком кода внутри

Вы должны понимать следствия, которые за этим происходят. Если мы написали synchronized, то на одном объекте (это защита данных объекта, у нас ООП, данных просто так в памяти Integerили Doubleнет, они лежат в объекте). Поэтому synchronizedговорит, «на одном объекте только один поток в один момент времени может исполнять этот код защищенный этим ключевым словом».

Пояснение: Thread1 первый пришел в метод, он проскочил внутрь фигурной скобки. Никакой другой поток больше зайти в этот код на этом же объекте не может. Любой другой поток придет сюда, и synchronizedскажет ему – «Занято! Жди!». И все, кто сюда придут – они будут ждать, пока вот этот первый не выйдет за границы защищенного раздела, и только после того как первый поток покинул эту область, кто-то из тех кто ждал сможет получить доступ в код этого метода. Мы даже не знаем, кто первый войдет. Может быть войдет первый тот, кто был последний, потому что в одной умной книжке написано, что это зависит от реализации виртуальной машины. Вот те, кто ждут, их можно реализовать в виде коллекций. Какой? Можно Queue, можно Stack. И мы не знаем, на самом деле, какой из тех кто ждет на самом деле первый, а кто последний войдет потом туда.

· первая версия synchronized: делает за нас выбор на каком объекте включать защиту.

· вторая версия synchronized: гибкий вариант, где я сам выбираю, какой объект надо защищать.

Это важное отличие.

 

 


Поделиться с друзьями:

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.007 с.