Данный гист содержит основную информацию, которую нужно знать о Java Standart Edition.
-
-
Save vchernogorov/eb127203ca40cb0e84b46c2b8bb6790f to your computer and use it in GitHub Desktop.
- https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#yield()
- https://ru.wikipedia.org/wiki/%D0%9C%D1%8C%D1%8E%D1%82%D0%B5%D0%BA%D1%81
- https://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80_(%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F)
- https://en.wikipedia.org/wiki/Happened-before
- https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html
- https://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601/192-1511873-1398145?ie=UTF8&*Version*=1&*entries*=0
- https://habrahabr.ru/company/golovachcourses/blog/256883/
- http://ru.stackoverflow.com/questions/1271/%D0%9A%D0%BB%D1%8E%D1%87%D0%B5%D0%B2%D0%BE%D0%B5-%D1%81%D0%BB%D0%BE%D0%B2%D0%BE-volatile-%D0%B2-java
- https://ru.wikipedia.org/wiki/%D0%90%D1%82%D0%BE%D0%BC%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F
-
Monitor - высокоуровневый механизм взаимодействия и синхронизации процессов, обеспечивающий доступ к неразделяемым ресурсам.
- При многозадачности, основанной на мониторах, компилятор или интерпретатор прозрачно для программиста вставляет код блокировки-разблокировки в оформленные соответствующим образом процедуры, избавляя программиста от явного обращения к примитивам синхронизации.
-
Semaphore - семафор, самый простой тип блокировки, ограничивает количество потоков, которые могут войти в заданный участок кода.
- Семафоры используются для синхронизации и защиты передачи данных через разделяемую память, а также для синхронизации работы процессов и потоков.
-
Mutex - двоичный простейший семафор, который может находиться в одном из двух состояний: отмеченном или неотмеченном. Он отличается от семафора тем, что только владеющий им поток может его освободить, т.е. перевести в отмеченное состояние.
- Задача мьютекса — защита объекта от доступа к нему других потоков, отличных от того, который завладел мьютексом.
- В каждый конкретный момент только один поток может владеть объектом, защищённым мьютексом.
- Если другому потоку будет нужен доступ к переменной, защищённой мьютексом, то этот поток блокируется до тех пор, пока мьютекс не будет освобождён.
-
Reentrant mutex - мьютекс, который может быть залочен несколько раз одиним и тем же процессом/потоком без создания взаимной блокировки.
-
Lock - блокировка, механизм синхронизации, позволяющий обеспечить исключительный достп к разделяемому ресурсу между несколькими потоками.
- Мягкая блокировка - каждый поток пытается получить блокировку перед доступом к соответствующему разделямому ресурсу.
- Обязательная блокировка - попытка несанкционированного доступа к заблокированному ресурсу будет прервана, через создание исключения в потоке, который пытался получить доступ.
-
Spinlock - тип блокировки, который заставляет поток в бесконечном цикле пытаться получить доступ к блокировке.
- Так как поток остается активным но не выполянет полезной работы, то использование данной блокировки не эффективно.
-
Deadlock - взаимное исключение, блокировка, при которой несколько процессов находятся в состоянии бесконечного ожидания ресурсов, занятых самими этими процессами.
-
Livelock - взаимное исключение, блокировка, при которой несколько процессов находятся в состоянии бесконечного зацикливания и не производят полезной работы.
-
Process - процесс обладает автономной средой выполнения.
- Каждый процесс, в частности, имеет собственную область памяти.
- Процесс обычно воспринимается, как синоним выполнению программы или приложения. Однако бывает, что одна приложения занимает несколько процессов.
- Большинство реализаций JVM запускаются в едином процессе.
- Java приложение может создать дополнительный процесс с помощью ProcessBuilder объекта.
-
Thread - потоки иногда называют легковесными процессами (lightweight processes). Потоки существуют внутри процесса - каждый процесс обладает хотя бы одним потоком.
- Потоки делят ресурсы процесса, включая память и открытые файлы.
- Приложение может быть как однопоточным, так и многопоточным, но всегда существует единственный "главный" поток, с которого запускается приложение.
-
Interrupt - прерывание является указанием потоку остановить выпонение.
-
Join - позволяет одному потоку ждать окончание выполнения другого потока.
-
Thread safe - участок кода, который работает корректно как в однопоточной, так и в многопоточной среде.
- Not thread safe - участок кода, который работает корректо только в однопоточной среде.
-
Thread affinity - при старте потока, можно указать в рантайм среде, чтобы поток был привязан к определенному ядру.
-
EDT (Event Dispatching Thread) - специальный поток, используемый для обработки событий из очереди событий. Такой подход является концептом событийно-ориентированного программирования.
- Такие GUI фреймворки, как, например, AWT или Swing, используют EDT.
-
Race condition - ошибка проектирования многопоточной системы или приложения, при которой работа системы или приложения зависит от того, в каком порядке выполняются части кода.
-
Context switches - когда планировщик временно приостанавливает работу потока, чтобы активировать другой поток.
- Частое явление в приложениях с кучей потоков, что очень дорого им обходится из-за:
- Сохранение и восстановление выполняемого контекста
- Непостоянное местоположение в памяти
- Затрачивание CPU на планирование потоков, которое нужно тратить на их использование.
-
Atomic action (Атомарная операция) - операция, выполняющаяся как единое целое, либо не выполняющаяся вовсе.
- Атомарная операция не может быть прервана: она либо выполняется полностьбю, либо не выполняется вовсе.
- Атомарная операция не производит изменений внешней среды во время выполнения, только по окончании.
- Атомарная операция открыта влиянию только одного потока.
-
Happened-before relationship - отношение "выполняется прежде" двух событий, которое гарантирует, что память, записанная событием A будет видна для события B, т.е. событие А завершает свою запись перед тем, как B начнет чтение.
- Данное отношение транзитивно, иррефлексивно, антисимметрично.
- Транзитивно - для любых 3-х событий a, b, c, если событие a происходит перед b, и b происходит перед c, тогда a должно происходить перед c.
- Иррефлексивно - ни одно событие не должно происходить перед собой.
- Антисимметрично - если событие a должно произойти перед событием b, то обратное невозможно.
-
Critical section - участок кода, в котором производится доступ к общему ресурсу, который не должен быть одновременно использован более чем одним потоком.
- Мьютекс является процедурой входа/выхода из критической секции.
-
sleep()
- заставляет поток остановить свое выполнение на указанное время. При этом поток не теряет контроль над монитором. -
start()
- запускает данный поток из текущего потока.- Этот метод вызывает
run()
метод этого же потока.
- Этот метод вызывает
-
run()
- наследникиThread
должны перегружать данный метод. Он вызывается при старте потока. -
interrupt()
- прерывает выпонение потока.InterruptedException
- данный поток получит это исключение, если произошло успешное прерывание потока.ClosedByInterruptException
- если данный поток был заблокирован I/O операцией, то поток получит это исключение по окончанию прерывания.
-
setPriority()
- изменяет приоритет данного потока.- Минимальный приоритет - 1, максимальный - 10.
-
join()
- заставляет поток ждать не более чем указанное время, чтобы завершиться.- Реализация данного метода использует цикл с вызовом
wait()
, который вызывается покаisAlive
. После завершения потока вызываетсяnotifyAll()
метод. - Он создан для того, чтобы приложения не использовали методы
wait()
,notify
,notifyAll
методы изThread
сущностей, так как это не рекомендованно. - Если не указывать время или указать 0, то поток будет ждать вечно чтобы умереть... пичаль.
- Реализация данного метода использует цикл с вызовом
-
setDaemon()
- отмечает данный поток как поток-демон или пользовательский поток.- JVM отрубается если все запущенный потоки являются демонами.
- Этот метод должен выполняться перед стартом потока.
-
yield()
- указывает планировщику, что текущий поток закончил свое выполнение и готов перейти в пользование процессора. Планировщик однаком может игнорировать это указание.- Использование данного метода редко является уместным. Он может использоваться для дебага или тестирования.
-
JMM (Java Memory Model) - описывает поведение потоков в среде исполнения Java.
- Однопоточные программы выолняются псевдопоследовательно, то есть в реальности процессор может выполнять несколько операций за такт, заодно изменив их порядок, однако все зависимости по данным остаются, так что поведение не отличается от последовательного.
-
java.lang.Thread
- каждый поток ассоциируется с объектом этого класса.Thread.sleep()
отдает команду текущему потоку приостановить выполнение на указанное время.Thread.interrupted()
возвращаетtrue
, если выполнение потока было прервано.thread.join()
позволяет одному потоку ждать окончания выполнения другого (т.е. текущий ждет выполнения потокаthread
).
-
java.lang.Runnable
- интерфейс определяет единственный методrun
, который должен содержать код, который будет выполняться в потоке. -
volatile
- данный модификатор указывает компилятору, что чтение перемнной будет производиться прямо из памяти, что позволяет нескольким потокам видеть последнее значение переменной. -
java.util.concurrent.locks.Lock
- интерфейс, реализации которого предполагают более обширные операции блокировки, чем предоставляемыеsynchronized
методами и блоками.
Спасибі велике за матеріал
Ніде не міг знайти
Благодарю!
Метод run() - subclasses of Thread should override(переопределять) this method.