Вопрос: Видите здесь объявлена переменная, которая называется threadLocal, но она static? А вот теперь скажите, сколько у нас статических переменных в памяти? — КиберПедия 

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Вопрос: Видите здесь объявлена переменная, которая называется threadLocal, но она static? А вот теперь скажите, сколько у нас статических переменных в памяти?

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

Ответ: Одна. Это я вам на прошлом курсе говорил. А на этом курсе теперь по другому: Одна на поток,потому что если у вас будет 10 потоков, которые работают с этой переменной, то это значит будет в каждом потоке в его локальной памяти 1 экземпляр. В этом потоке может быть создано 1000 объектов, но staticбудет 1, но на поток.

Сейчас откроем Demo2, потому что там подобный код уже сделан. Итак мы берем заготовку. Вот она.

Давайте пробежимся. Что у нас здесь есть? Все начинается все с класса main в котором написана переменная. Мне немного не нравится, как я это сделал. Во-первых, мне не нравится, что здесь идет какой-то @override, initialValue, какое-то случайное число. Да кому это надо? Я сам задам нормальные значения! Не нужно мне никаких случайных чисел! Поэтому здесь у меня будет написано в классе Mainбудет переменная static, пусть называется она threadLocal, она будет создана newThreadLocal, и она является оберткой для Integer. Вот! После круглых скобок поставлю точку с запятой, а все остальные переопределения выбросим. Ничего нам не надо. Инициализируем своими руками.

Теперьсмотрите. Началасьmain (точкавхода).Унасначалсяглавныйпоток. И мы берем и инициализируем threadLocalс каким-то числом. Здесь также берется с потолка. Я честно говоря не хочу брать с потолка. Я хочу положить туда 54.

 

ДальшесоздаетсяобъектRunnable. Эточтотакое? Вы видите создание объекта анонимного класса. Главное, чтоонrunпереопределяет. Ачтовrunделается? А там кто-то берет поток (пока еще не стартованный) и случайным образом threadLocalустанавливает через next, и берет в диапазоне до 100.Причем чтобы мы видели какое там значение будет подставлено, оно тут же печатается. И последний System.out.println, который в run, он обращаясь к переменной (вначале он добирается до потока и пишет его имя), а затем пишет какое значение в этот threadLocalон положил. Это пока просто объект. Но вот этот объект используется трижды для запуска трех потоков. Потоков можно было сделать больше, но это совершенно не принципиально. Цикл forв котором написано «(newThread(runner)).start()». Значит у меня стартует три потока. Каждый из них берет переменную threadLocalи присваивает какое-то значение. И я вижу какое... Оно печатает к тому же. Затем у меня программа запустив три потока должна дождаться, когда эти потоки отработают, поэтому нас сейчас как-то надо будет подумать, как притормозить ее. Напишем Thread.sleep(100). А исключение обработаем throws InterruptedException.

Итак, главный поток сделал 54. Три потока меняло значения. И какое останется значение после того как main в конце распечатает.

Жмем F6.

run: Thread Thread-0, value is 1 Thread Thread-1, value is 6 Thread Thread-2, value is 72 MainThread, valueis 54 СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 3 секунды)

Почему 54 осталось неизменной в главном потоке? Почему? Потому что это три разных области памяти. Специально написан такой код. У нас 4 потока и переменных threadLocalза счет этого класса – она существует в четырех местах.

Единственная общая проблема в Java, что как только мы начинаем использовать какие-то классы (в данном случае ThreadLocal) с продвинутой логикой, которая знает где локальная память потока мы не можем использовать простые типы, а только обертки. Только ссылочные типы работают с Generic’ами. Так что вы не можете положить туда int, doubleи т.д. Это, конечно, расстраивает.

В ваших переменных, которые вы объявили intnumвнутри Runnable. Если я создам много таких

Сколько здесь объектов Runnableбыло в штуках создано в этой программе? 1

А сколько я запустил потоков? Я запустил допустим 100000 потоков и все на одном объекте Runnable. У вас переменная num будет одна – это часть объекта, а переменная static– это статические глобальные данные. У нас есть описание класса, и staticпо сути является частью описания класса. Этотожевпамятирасположеноstatic-описание 1 раз. Но если вы переменную упаковываете в ThreadLocalона получается статической переменной одна для каждого потока.

Основная идея ThreadLocal – это сделать данные так, чтобы никакой поток до них добраться не мог.

Если вы пишете класс ThreadLocal, а это значит будет создаваться статическая переменная 1 в каждом потоке (не на все).

Переменная ThreadLocal (ссылка на объект) она одна. Сам объект хранилища – он один. Оно уже в зависимости …. Соответственно, каждый поток … Но сами данные …. Но она их раскидывает по локальной памяти потока. Внутри этого хранилища мы знаем какому потоку какие данные… Ну т.е. если мы 

Основная идея ThreadLocal– это спрятать (основная мегазадача). Почему? Да, потому что мы приближаемся к такой вещи, как синхронизация потоков.


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

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

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

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



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

0.006 с.