User hubert
hubert
41 уровень

Уровень 17: план уровня и доп. материалы

Статья из группы Архив info.javarush.ru
План уровня:
  • Знакомство с нитями: synchronized, volatile, yield
  • использование общего ресурса
  • знакомство с мютексом
  • synchronized блок, synchronized метод
  • локальный кэш, volatile
  • минимальный отрезок времени работы нити - квант, yield
На этом уровне трэды рассматриваются поверхностно. Детальное углубленное изучение будет на 25-28 уровнях.
Курс Java Что еще можно посмотреть на досуге: почитать про синхронизацию Немного мотивации http://www.quizful.net/interview/java/volatile-vs-synchronized
Нашли классную ссылку к материалу данной темы? Добавьте ее сюда в виде комментария. Возможно, именно Ваша ссылка поможет другому человеку стать программистом и улучшить свою жизнь!

Вернуться к плану обучения
Вернуться к обучению
java онлайн
на JavaRush
Комментарии (19)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
jeep33 Уровень 32, Великий Новгород, Россия
15 апреля 2016
klyushin Уровень 18, Украина
17 марта 2016
В самом начале лекции дается пример:
class Clock implements Runnable
{
 private boolean isCancel = false;

 public void cancel()
 {
  this.isCancel = true;
 }

 public void run()
 {
  while (!this.isCancel)
  {
   Thread.sleep(1000);
   System.out.println("Tik");
  }
 }
} 


public static void main(String[] args)
{
 Clock clock = new Clock();
 Thread clockThread = new Thread(clock);
 clockThread.start();

 Thread.sleep(10000);
 clock.cancel();
} 


Может быть у меня неправильные ожидания были от него, если так то поправьте меня, но мне кажется пример запутывает…
Я запускаю пример и что с volatile что без него работа программы одинаково заканчивается. Я ожидал что без volatile программа зависнет т.к.
Нить «не знает» о существовании других нитей.

В методе run переменная isCancel при первом использовании будет помещена в кэш дочерней нити.
но этого не происходит. Так вот всему виной, как опять таки, я понял: то что в цикле while(!this.isCancel) находятся Thread.sleep(1000); и System.out.println(«Tik»); — если их убрать то эффект, о котором я говорю появится. При добавлении volatile программа будет заканчиваться, а без него виснуть в цикле.

Я долго не мог понять почему у парня в примере все работает, а у меня нет…

Также не могу понять почему без volatile если в цикле while(this.isCancel) добавить вот такие операции:
while (!this.isCancel)
        {
            a++;
            b=0;
        }

программа будет виснуть… или это как раз атомарные операции? Кто-то может объяснить или подсказать что прочитать что бы въехать в этот нюанс? Спасибо!
4joke Уровень 18, Украина
30 октября 2014
Я один не могу читать Thinking in java?)
antonchar Уровень 35
26 июля 2014
hubert , по ссылке ничего нет: Период регистрации домена истек.
Скажи, пожалуйста, какие разделы книги читать.
exis19ce Уровень 0, Днепропетровск
9 июля 2014
подскажите, пожалуйста!
по поводу volatile, если их будет слишком много в программе, из-за этого не будет падать скорость программы?
ttt Уровень 30, Симферополь, Украина
19 июня 2014
Не знал что метод wait() может снимать блок
phashik Уровень 28
14 марта 2014
Мне кажется, или тут неправильно? (самое начало лекции)
VitaminX Уровень 11
7 февраля 2014
habrahabr.ru/post/108016/
5 вещей, которых вы не знали о многопоточности
masterSporta Уровень 41, Санкт-Петербург, Россия
29 января 2014
Этот сайт пока недоступен, а почитать хочется. И на 16 уровне лекцию пропустил( и тут пропускаю
Sant9Iga Уровень 41, Украина
16 сентября 2013
click неплохая статья про потоки и синхронизацию в частности)