hubert
41 уровень

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

Пост из группы Архив info.javarush.ru
3710 участников
План уровня:
  • Comparator, сортировка коллекций
  • Разделяемые ресурсы, Конфликты, проблема совместного доступа
  • Применение volatile
  • Мютекс и монитор
  • Применение synchronized
  • Concurency, BlockingQueues (java7)

Курс Java Что еще можно посмотреть на досуге: Ответы на вопросы к собеседованию по теме уровня. Часть 1. Ответы на вопросы к собеседованию по теме уровня. Часть 2.
Нашли классную ссылку к материалу данной темы? Добавьте ее сюда в виде комментария. Возможно, именно Ваша ссылка поможет другому человеку стать программистом и улучшить свою жизнь!

Вернуться к плану обучения
Вернуться к обучению
java онлайн
на JavaRush
Комментарии (24)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизоваться
lexmirnov29 уровень, Москва
30 октября 2017, 10:37
kirjust30 уровень
20 сентября 2016, 22:23
очень крутая (по мне) визуализация реализации многопоточности
sourceforge.net/projects/javaconcurrenta/
Joysi41 уровень
9 июня 2016, 17:56
Не сразу смог въехать в чем и за счет чего преимущество атомарных типов по сравнению с synchronized. Вот чутка глубже (Чем дается в лекции) копнул.

Для работы с общими данными в thread-ах расмотрим «сферический» потокобезопасный int с двумя операциями на нем ++ и --:

public class SynchronizedCounter {
   private int c = 0;
   public synchronized void increment() { c++; }
   public synchronized void decrement() { c--; }
   public synchronized int value() { return c; }
 }

У такого метода есть важный недостаток — скорость работы. Так как много времени уйдет на дополнительные сервисные действия при входе в синхронизированные методы (или внутрь synchronized блока, что в ряде случаев хуже):
1. попытка блокирования монитора
2. блокировка потока
3. разблокировка монитора
4. разблокировка потока
В процессорах начиная с конца прошлого века (в связи с широким распространением многопроцессорности и позже многоядерности) появилась реализация инструкций из серии Compare And Save (CAS). Смысл:
Шаг 1. Читаем значение равное А по адресу V
Шаг 2. Вычисления, в процессе которых получили из A новое значение B
Шаг 3. CAS заменит по адресу V на новое значение B, если только непосредственно в момент замены там было А. (вот это самый ключевой момент!)
И выставит флаг состояния, если такую замену совершил.

То есть ненадо ничего блокировать, процессор сделает за вас и просто не даст записать новое значение, если старое было модернизировано не вашей задачей.
Процесс в курсе, что используемая в вычислениях стартовое значение переменной «протухло» и сам решит перестартовать новое вычисление или прервать вычисление.
Атомарные переменные можно рассматривать как продвинутые volatile примитивы у которых появился CAS.
Выгода 1) Отсутствие необходимости блокировок (synchronized) в следствие наличия реализации
IgorBrest33 уровень
10 июня 2016, 09:20
познавательно
Tigran30 уровень, Москва
26 июля 2016, 11:01
Нифига себе, минилекция в комментарии! Спасибо!
kirjust30 уровень
20 сентября 2016, 22:48
честно переписал, провел эксперимент. У меня на машине результаты:
stop atomic dec, time=18470
stop atomic inc, time=18470
stop syncr inc, time=42106
stop syncr inc, time=42122

Что это за зверь такой стоит, что в 3 раза быстрее моей работает? Думал мой камушек еще неплох… AMD-4350, 4.2GHz
и да, в начале поставил модификатор final перед
<code>final SynchronizedCounter  counter1 = new SynchronizedCounter();
        final AtomicInteger counter2 = new AtomicInteger(1);
        final long startTime = System.currentTimeMillis();</code>
без этого, компилятор ругался и не хотел запускать. Оформил так же, анонимными вложенными классами.
Enigma40 уровень, Москва
16 октября 2016, 21:52
В Java 8 теперь не обязательно указывать «final» перед переменными, которые будут использоваться в анонимных классах, но если потом в коде попытаешься изменить ту переменную, то компилятор выдаст ошибку.
Joysi41 уровень
17 октября 2016, 13:07
Простите, что поздно ответил(в отпуске был): intel i7-2600 + (возможно важно, на тот момент была установлена память с неплохими характеристиками 8Gb RAM 8-8-8-24).

P.S. Oracle JDK 1.8.073
P.S.2 Использование Atomic в разы выгоднее — что более важно.
riko40 уровень, Минск
21 октября 2016, 12:16
на древнем AMD Phenom II X4 955 @ 3.5 GHz:
stop atomic dec, time=9239 ms.
stop atomic inc, time=9239 ms.
stop synchr inc, time=21540 ms.
stop synchr dec, time=21744 ms.
Byshevsky16 уровень
2 апреля 2016, 14:53

В конструкторе параметр age а в компораторе height. Или так и задумано?
Shtramak40 уровень, Киев
18 апреля 2016, 18:43
По ходу даже компилятор не осмелился сортировать женщин по возрасту… ))) Видимо выдавал нечто на подобии «It's a crime to sort Woman by age», вот и пошли на хитрость :)
deft31 уровень
7 июня 2016, 11:45
Посмотрите на все поля класса Womаn. Мы пишем компаратор для сравнения по росту. И в строке Collection.sort(...) мы сортируем Womаn по росту. Можем написать компаратор для любого поля или нескольких полей.
Byshevsky16 уровень
7 июня 2016, 16:26
В квадратике «пример использования» кусок программы в которой перед инициализацией компаратора добавляются три объекта вумен, при создании которых заполняется поле age. Как прикажете компаратору сортировать объекты по полю height если оно у всех имеющихся объектов null?
Alejandro_Kolio30 уровень, Санкт-Петербург
25 июля 2016, 23:06
SortWomanByAgeException
ferasinka32 уровень, Санкт-Петербург
4 августа 2016, 22:07
Не null, a 0 ;-)
Byshevsky16 уровень
4 августа 2016, 22:35
по нулю тоже сильно не отсортируешь. Вот скажи, я же прав что там ошибка?
ferasinka32 уровень, Санкт-Петербург
5 августа 2016, 00:35
По факту — да, нужно исправить.
Medniy33 уровень, Львов
9 марта 2016, 13:45
Roman_kh33 уровень, Харьков
5 января 2016, 19:40
post about «happens-before»: link
odabc41 уровень, Одесса
23 сентября 2015, 16:45
В главе 1 в примере написано
Пример кода, пользователи сортируются по росту:
на самом деле
return o1.weight — o2.weight;
исправьте пожалуйста!
ortega8929 уровень, Kostroma
25 февраля 2016, 01:30
При сравнении так и задумано. Из первого вычитается второе.
Результат:
а) разница < 0 означает, что первое < второго
б) разница > 0 означает, что первое > второго
в) разница == 0 означает, что первое и второе могут идти в любом порядке
mrzzzio30 уровень
11 марта 2015, 11:34
Действительно, а что еще можно посмотреть на досуге?
AlexY40 уровень, Великий Новгород
7 ноября 2014, 23:15
Неужели материал лекции был исчерпывающим? :)