anchor.diff:  
   В Java вытесняющая многозадачность.
   
  -=== *Сравните кооперативную и вытесняющую многозадачности*
  +=== Сравните кооперативную и вытесняющую многозадачности
   
   При вытесняющей многозадачности по таймеру, который генерирует прерывания через определенные промежутки времени(~ 1мс), операционная система передает управление планировщику. Планировщик выбирает задачу из очереди и передает управление этой задачи. Задача выполняется определенное количество времени и безусловно прерывается. При вытесняющей многозадачности программа после завершения работы уведомляет операционную систему, что она завершила работу и можно передать управление другой программе.
   
  
positive.code: * `BLOCKED` - поток заблокирован на мониторе; Поток переходит в него когда пытается войти в критическую секцию, но она уже занята другим потоком. 
  * `TERMINATED` - поток завершил выполнение. 
  
  === *Отличие Thread.start() и Thread.run()?*
  
  `Thread.start()` в отличие от `Thread.run()` переводит поток в состояние RUNNABLE и запускает код независимо от текущего потока. В случае же вызова `Thread.run()` код выполнит тот же поток, который вызвал этот метод. Семантически эти 2 метода совершенно различны: `run` отвечает за задачу, которую нужно выполнить независимо, а `start` за поднятие инфрастуктуры по выполнению этой задачи.
  
  === *Что происходит при вызове Thread.interrupt()?*
  
  Потоку, для которого вызвали этот метод, выставляется флаг того, что он прерван. Код, исполняющийся в этом потоке, может периодически проверять этот флаг на предмет того, что ему нужно завершить выполнение. Если поток в момент вызова `interrupt` спал, ждал, был заблокирован на мониторе или на I/O(InterruptibleChannel), то выбросится `InterruptedException` и флаг прерывания сбросится. Программист имеет возможность обработать `InterruptedException`, выполнить действия по безопасному завершению и решить, что делать дальше (пробросить исключение, восстановить статус прерывания или завершить работу).
  
  === *Что происходит при вызове Thread.stop()?*
  
  При вызове `Thread.stop` поток отпускает все мониторы, которые он держал,  выкидавает ошибку `ThreadDeath` и завершается принудительно.
  
  === *Почему Thread.stop()/destroy()/suspend()/resume() — deprecated?*
  
  Потому что они небезопасны. Поток может быть прерван в любой момент и обязан отпустить все блокировки. То есть например во время атомарного обновления структуры данных, поток может прерваться и структура окажется в поврежденном состоянии. Это неприемлимо. Для того, чтобы защититься в коде нужно ловить `ThreadDeath`, обрабатывать его и пробрасывать дальше. Но такой подход не практичен, сильно усложняет код и поддерживает плохую практику убивания ресурсов без их очистки.
  
  === *Перечислите все причины по которым может выскочить InterruptedException*
  
  * Поток прерван во время ожидания на мониторе
  * Поток прерван во время засыпания
  
negative.code: 
  *Mutual exclusion* - `AtomicInteger` не гарантирует взаимного исключения. Несколько процессов могут одновременно читать его значение, но писать может только один.
  
  === Атомарно ли ++ для volatile переменной?
  
  Нет, так как в реальности ++ представляет из себя 3 инструкции: чтение, инкремент и запись. volatile гарантирует только атомарность одиночной записи (мы не увидим шум внутри поля), но не атомарность набора операций. То есть никто не запрещает 2 процессам прочитать одинаковое значение переменной, сделать инкремент и записать его в память. В этом случае мы получим "потерянную запись". 
  
  ==  Базовое API, примитивы/конструкции
  
  === Thread.getState() возвращает экземпляр Thread.State. Какие возможны значения?
  
  * `NEW` - поток был создан, но еще не стартовал; 
  * `RUNNABLE` - поток выполняется. Этот статус не обязательно значит, что поток выполняет код. Это всего лишь значит, что поток доступен планировщику потоков для выбора потока на исполнение;
  