- Что такое критический блок?
- Что такое thread synchronization?
- Объясните концепт happens before в синхронизации потоков
- Как используется ключевое слово synchronized?
- В чем разница между синронизированным блоком и методом?
- Почему синхронизированный блок предпочтительнее синхронизированного метода?
- Что такое static переменные?
- почему изменение, внесенное одним объектом в статическую переменную, не отображается для объекта в другом потоке?
- Что такое thread local storage?
- Что следует хранить в локальном хранилище потоков?
- Почему бы вам не синхронизировать доступ к объектам, хранящимся в ThreadLocal Storage?
- Почему вы должны удалять объект из локального хранилища потоков?
- Объясни что такое Barrier synchronizer?
- Можно ли переиспользовать баррьер?
- Что, если один из потоков завершится,покаа другие потоки ждут в Барьере?
- Для какой работы вы используете Barrier?
- Объясни что такое Semaphore?
- Что произойдет, если вы вызовете release() больше раз, чем acquire()?
- [Что-происходит,-когда-вы-вызываете-acquire(),-но-permits-отсутствуют?]
- Как получить взаимоисключающую блокировку с помощью семафора?
- Где используется семафор?
- Расскажи что такое Executor Service?
- Как отслеживается прогресс и статус выполнения задач?
- Использует ли ExecutorService выделенные потоки для выполнения задач в очереди?
- Как с ExecutorService получить результаты от нескольких задач?
Фреймворк fork-join позволяет разбить определенную задачу на несколько воркеров, а затем дождаться результата, чтобы объединить их
помогает вам использовать преимущества нескольких процессоров.
Java ExecutorService представляет собой механизм асинхронного выполнения, который может выполнять задачи одновременно. ExecutorService создает и поддерживает повторно используемый пул потоков для выполнения отправленных задач.
ExecutorService предоставляет объекты Future для отслеживания хода выполнения и статуса выполняемой задачи.
Все задачи, переданные в Executor, ставятся в очередь, которые выполняются потоками пула потоков.
CompletionService of Executor можно использовать для получения результатов из нескольких задач.
Executor framework предоставляет инфраструктуру для выполнения набора связанных задач в потоках.
- Создание и уничтожение потоков.
- Поддержание оптимального количества потоков для задачи.
- Параллельное и последовательное выполнение задач.
- Разделение подтверждение выполнения задачи и процесс выполнения задачи.
- Политики связаны с контролем выполнения задач.
Latch заставляет группу потоков ждать завершения набора операций.
Все потоки ждут вызова метода await() до тех пор, пока countDown() не будет вызван столько раз, сколько установлен счетчик защелок.
позволяет двум потокам ждать друг друга в точке синхронизации для обмена элементами.
Phasre очень похож на Barrier, также потоки ждут друг друга в точке синхронизации и потом продолжат рабоатть дальше, но в отличии от Barrier количество потоков меняется динамически
да, можно
Семафор поддерживает определенное количество разрешений на доступ к уязвимому коду.
Если release() вызывается больше раз, чем acquire(), то для каждого такого дополнительного release будет добавлено дополнительное permit.
Каждый вызов метода acquire() блокируется до тех пор, пока разрешение не станет доступным.
Если вы хотите получить взаимоисключающую блокировку, инициализируйте семафор только с одним permit
Семафор обычно используется для обеспечения ограниченного доступа к дорогостоящему ресурсу.
В барьерах набор потоков ожидает друг друга, в точке синхронизации, прежде чем двигаться вперед.
да
Если какой-либо из потоков преждевременно завершен, все остальные потоки, ожидающие в точке барьера, также будут завершены.
Барьеры обычно используются, когда вы разделяете операцию на несколько задач, выполняемых в разных потоках, и ждете завершения всех задач, прежде чем двигаться дальше.
Синхронизаторы синхронизируют несколько потоков для защиты уязвимого участка кода.
Barrier Semaphore Phaser Exchenger Latch
Блокировка - это механизм управления доступом к общим ресурсам в многопоточной системе. Блокировку можно получить и снять в разных критических блоках кода.
Атомарные классы предоставляют возможность выполнять атомарные операции с примитивными типами, так что только одному потоку разрешено изменять значение до завершения вызова метода.
Атомарные переменные обеспечивают атомарный доступ даже для составных операций, таких как операции до и после инкремента, что невозможно, если переменная объявлена как Volatile. Volatile просто гарантирует, что happens before чтение.
Потоки обычно объединяются, когда между потоками существует зависимость. Метод join() целевого потока используется для приостановки текущего потока. В таких ситуациях текущий поток не может продолжаться, пока целевой поток, от которого он зависит, не завершит выполнение.
wait() вызывается на мониторе объекта; тогда как sleep() вызывается в потоке. Объекты ожидания могут быть уведомлены; тогда как спящий поток не может. Спящий поток не может снять блокировку; тогда как ожидающий объект может. Чтобы разбудить спящий поток, вам нужна ссылка на него, которая не нужна для ожидающего объекта.
это локальная память потока
Идентификаторы транзакции или пользователя, в общем текущие рабочие данные
потому что они видны только в одном потоке
Чтобы предотвратить утечку, рекомендуется удалить объект ThreadLocal с помощью метода remove ().
Статические переменные используются в контексте объектов класса, где существует только одна копия статической переменной, независимо от того, сколько объектов класса создано.
если несколько потоков обращаются к одной и той же переменной, каждый поток сделает копию этой переменной в своем кэше ЦП, и изменения, сделанные потоком, не будут видны другим потокам.
Поле, помеченное как volotile, сохраняется и считывается непосредственно из основной памяти. Поскольку volotile поля хранятся в основной памяти, все потоки видят самую обновленную копию значения volotile поля, независимо от того, какой поток изменил его.
- Условная синхронизация достигается с помощью условной переменной вместе с методами wait () и notify () или notifyAll ().
Ключевое слово synchronized используется для обозначения критической части кода. Блокируется доступ для остальных потоков если критическую часть кода выполняет другой поток
Синхронизированный метод блокирует весь метод, синхронизированный блок блокирует тольуо критическую часть кода
Предпочитайте синхронизированный блок синхронизированному методу, поскольку блокировка блокируется только для локального объекта, а не для всего объекта класса.
это участок кода, который при одновременном доступе более чем одним потоком может оказать нежелательное влияние на результат.
контролирует доступ к критическим участкам кода для предотвращения нежелательных эффектов в программе.
Синхронизация создает буфер памяти, известный как «произошло до», который гарантирует, что любой другой поток, который впоследствии получает те же локальные объекты, может получить доступ ко всем изменениям, внесенным потоком в локальные объекты в критических секциях.
это одновременное выполнение нескольких задач; либо на нескольких ядрах, либо с помощью потока с приоритетным разделением времени на процессоре.
Это выполнение одной задачи на разных ядрах
это независимое выполнение процесса, не дожидаясь возврата значения от промежуточных операций.