Проходил 16 октября 2018 года в 20:00

Открытый вебинар Разработчик Java
Многопоточность в Java: по ту сторону от synchronized-notifyAll

Открытый вебинар онлайн

В первой части мы рассмотрели базовые примитивы многопоточной синхронизации в Java и написали программу Ping-Pong с применением synchronized-notifyAll.

На предстоящем мастер-классе мы продолжим изучение многопоточности и перепишем Ping-Pong несколькими способами без synchronized-notifyAll.

Смотрите запись первого урока и регистрируйтесь на II часть!
Преподаватель
Сергей Петрелевич

Запись

О курсе

Разработчик Java
50 000 ₽
5 месяцев
Начало 27 марта
  • Освоение разработки серверных приложений на Java.
  • Понимание библиотеки Java, особенностей языка и платформы Java.
  • Знание основных подходов программиста к проектированию приложений, работе с базами, файлами, веб-фронтендом.
  • Владение низкоуровневыми и высокоуровневыми подходами к созданию многопоточных и многопроцессных приложений.
  • {% safe_chunk 'lessons:visit_card_center-1' %}
{{ employers_count }} {% pluralize employers_count 'работодатель' 'работодателя' 'работодателей' %}
большое количество ...
Программа курса
Модуль 1
Язык и платформа Java
Модуль 2
Модуль 2: Проектирование
Модуль 3
Модуль 3: Работа с окружением
Модуль 4
Модуль 4: Многопоточность
Модуль 5
Проектная работа
Язык и платформа Java
1.1 Подготовка к курсу. ДЗ
Решение организационных вопросов.
Знакомство с инструментами:
- Git
- Idea
- maven
27 марта, 20:00 — 21:30
Домашние задания: 1
ДЗ
Проект maven с модульной структурой. 1) Создать аккаунт на github.com (если еще нет)
2) Создать репозиторий для домашних работ
3) Сделать checkout репозитория на свой компьютер
4) Создайте локальный бранч hw01-maven
5) Создать проект maven
6) В проект добавьте последнюю версию зависимости
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
7) Создайте модуль hw01-maven
8) В модуле сделайте класс HelloOtus
9) В этом классе сделайте вызов какого-нибудь метода из guava
10) Добавьте нужный плагин maven и соберите "толстый-jar"
11) Убедитесь, что "толстый-jar" запускается.
12) Сделайте pull-request в gitHub
13) Ссылку на PR отправьте на проверку.
1.2 Дополнение к maven, история изменения языка
Процесс разработки ПО. Путь сборки: от push до deploy
Maven:
- Shade Plugin,
- Dependency Scopes
- Версии Java, изменения в политике Oracle
30 марта, 10:00 — 11:30
2.1 Контейнеры и алгоритмы. ДЗ
Generics
Стандартные коллекции JDK
3 апреля, 20:00 — 21:30
Домашние задания: 1
ДЗ
DIY ArrayList . Написать свою реализацию ArrayList на основе массива.
class DIYarrayList<T> implements List<T>{...}

Проверить, что на ней работают методы из java.util.Collections:
Collections.addAll(Collection<? super T> c, T... elements)
Collections.static <T> void copy(List<? super T> dest, List<? extends T> src)
Collections.static <T> void sort(List<T> list, Comparator<? super T> c)

1) Проверяйте на коллекциях с 20 и больше элементами.
2) DIYarrayList должен имплементировать ТОЛЬКО ОДИН интерфейс - List.
3) Если метод не имплементирован, то он должен выбрасывать исключение UnsupportedOperationException.
2.2 Инструменты для преобразования контейнеров, unsafe, jmh
Unsafe
утилита JMH
Принципы построения hashMap
Apache Commons
Google Guava
6 апреля, 10:00 — 11:30
3.1 QA и тестирование
Виды тестов
Инструменты: junit, mockito
TDD
10 апреля, 20:00 — 21:30
3.2 Аннотации. ДЗ
Reflection
Аннотации
13 апреля, 10:00 — 11:30
Домашние задания: 1
ДЗ
Свой тестовый фреймворк.. Написать свой тестовый фреймворк.

Поддержать свои аннотации @Test, @Before, @After.

Запускать вызовом статического метода с именем класса с тестами.

Т.е. надо сделать:
1) создать три аннотации - @Test, @Before, @After.
2) Создать класс-тест, в котором будут методы, отмеченные аннотациями.
3) Создать "запускалку теста". На вход она должна получать имя класса с тестами.
4) "Запускалка" должна в классе-тесте найти и запустить методы, отмеченные аннотациями.
5) Алгоримт запуска должен быть такой:
метод Before
методы Test
метод After
для каждой такой "тройки" надо создать СВОЙ объект класса-теста.
6) Исключение в одном тесте не должно прерывать весь процесс тестирования.
4.1 Углубленные основы (примитивные типы, Remote debug, Hot swap).
Примитивные типы, строки, массивы.
Память, которую занимают объекты.
Remote Debug
Hot swap
17 апреля, 20:00 — 21:30
4.2 Байт код, class-loader, инструменатция, jol, asm. ДЗ
Байт код. Содержание .class. Декомпиляция
Class Loader: примеры Class Lloader'ов,
Самодельный простой Cloass Loader
Изменение размера объекта, утилита JOL
Instrumentation
ASM – инструмент для анализа и манипуляций с байт-кодом.
20 апреля, 10:00 — 11:30
Домашние задания: 1
ДЗ
Автомагическое логирование.. Разработайте такой функционал:
метод класса можно пометить самодельной аннотацией @Log, например, так:

class TestLogging {
@Log
public void calculation(int param) {};
}

При вызове этого метода "автомагически" в консоль должны логироваться значения параметров.
Например так.

class Demo {
public void action() {
new TestLogging().calculation(6);
}
}

В консоле дожно быть:
executed method: calculation, param: 6

Обратите внимание: явного вызова логирования быть не должно.
5.1 Сборщик мусора. ДЗ
Концепция сборки мусора в JVM
Виды сборщиков мусора
Мониторинг работы сборщиков
Примеры проблем производительности, связанных с мусором
24 апреля, 20:00 — 21:30
Домашние задания: 1
ДЗ
Сравнение разных сборщиков мусора. Написать приложение, которое следит за сборками мусора и пишет в лог количество сборок каждого типа
(young, old) и время которое ушло на сборки в минуту.

Добиться OutOfMemory в этом приложении через медленное подтекание по памяти
(например добавлять элементы в List и удалять только половину).

Настроить приложение (можно добавлять Thread.sleep(...)) так чтобы оно падало
с OOM примерно через 5 минут после начала работы.

Собрать статистику (количество сборок, время на сборрки) по разным GC.

!!! Сделать выводы !!!
ЭТО САМАЯ ВАЖНАЯ ЧАСТЬ РАБОТЫ:
Какой gc лучше и почему?
5.2 Java 8
Чистые функции
Немутирующие данные
Лямбда-функции
Монады
Streams
27 апреля, 10:00 — 11:30
Модуль 2: Проектирование
6.1 Концепты проектирования ООП. ДЗ
Идеальная архитектура
Coupling и Cohesion
Полиморфизм
SOLID Принципы
1 мая, 20:00 — 21:30
Домашние задания: 1
ДЗ
Эмулятор банкомата. Написать эмулятор АТМ (банкомата).

Объект класса АТМ должен уметь:
- принимать банкноты разных номиналов (на каждый номинал должна быть своя ячейка)
- выдавать запрошенную сумму минимальным количеством банкнот или ошибку если сумму нельзя выдать
Это задание не на алгоритмы, а на проектирование.
Поэтому оптимизировать выдачу не надо.
- выдавать сумму остатка денежных средств
6.2 Behavioral patterns
Изучаются паттерны:
- Observer
- Command
- Chain of responsibility
- Memento
- State
- Strategy
- Visitor
4 мая, 10:00 — 11:30
7.1 Structural patterns. ДЗ
Изучаются паттерны:
- Adapter
- Decorator
- Bridge
- Composite
- Facade
- Flyweight
- Proxy
8 мая, 20:00 — 21:30
Домашние задания: 1
ДЗ
Департамент ATM. Написать приложение ATM Департамент:
1) Департамент может содержать несколько ATM.
2) Департамент может собирать сумму остатков со всех ATM.
3) Департамент может инициировать событие – восстановить состояние всех
ATM до начального (начальные состояния у разных ATM могут быть
разными).
Это тренировочное задание на применение паттернов.
Попробуйте использовать как можно больше.
7.2 Creational patterns
Изучаются паттерны:
- Factory Method
- Abstract Factory
- Builder
- Prototype
- Singleton
- Object Pool
11 мая, 10:00 — 11:30
Модуль 3: Работа с окружением
8.1 Сериализация. ДЗ
Java I/O
Что такое сериализация?
Java API для работы с JSON
GSON
Google ProtoBuf
15 мая, 20:00 — 21:30
Домашние задания: 1
ДЗ
Cвой json object writer. Напишите свой json object writer (object to JSON string) аналогичный gson на основе javax.json.

Поддержите:
- массивы объектов и примитивных типов
- коллекции из стандартный библиотеки.
8.2 NIO.XML
XML:
- sax parser
- dom parser
- jaxb
NIO, файловые операции
18 мая, 10:00 — 11:30
9.1 JDBC. ДЗ
ACID
Транзакции в СУБД
JDBC, роль JDBC в стеке технологий
In-memory база данных – H2
ORM Pattern “Executor”
22 мая, 20:00 — 21:30
Домашние задания: 1
ДЗ
Самодельный ORM. Работа должна использовать базу данных H2.
Создайте в базе таблицу User с полями:

• id bigint(20) NOT NULL auto_increment
• name varchar(255)
• age int(3)

Создайте свою аннотацию @Id

Создайте класс User (с полями, которые соответствуют таблице, поле id отметьте аннотацией).

Напишите JdbcTemplate, который умеет работать с классами, в котрых есть поле с аннотацией @Id.
Executor должен сохранять объект в базу и читать объект из базы.
Имя таблицы должно соответствовать имени класса, а поля класса - это колонки в таблице.

Методы JdbcTemplate'а:
void save(T objectData);
<T> T load(long id, Class<T> clazz);

Проверьте его работу на классе User.

Комментарии к реализации JdbcTemplate:
Метод save.
С помощью рефлексии в объекте objectData надо найти поле, отмеченное @Id
По значению поля @Id надо проверить, если ли этот объект в базе или нет.
Если объекта нет, надо сформировать insert, если есть update.
9.2 Общие вопросы работы с СУБД, myBatis
CAP – теорема
Подходы к организации блокировок данных
MyBatis
25 мая, 10:00 — 11:30
10.1 Hibernate. ДЗ
Hibernate, место Hibernate в современном стеке тнхнологий
Конфигурирование Hibernate в коде и в XML.
Java persistency query language.
DBSevice pattern.
29 мая, 20:00 — 21:30
Домашние задания: 1
ДЗ
Использование Hibernate. Работа должна использовать базу данных H2.

Возьмите за основу предыдущее ДЗ (Самодельный ORM)
и реализуйте функционал сохранения и чтения объекта User через Hibernate.
(Рефлейсия больше не нужна)
Конфигурация Hibernate должна быть вынесена в файл.

Добавьте в User поля:
адрес (OneToOne)
class AddressDataSet {
private String street;
}
и телефон (OneToMany)
class PhoneDataSet {
private String number;
}

Разметьте классы таким образом, чтобы при сохранении/чтении объека User каскадно сохранялись/читались вложенные объекты.
Не забывайте про сохранение абстракций в приложении (см. комментарий в вебинаре).
10.2 JPQL
Что такое Connection Pool и для чего он нужен?
Изучение HikariCP
Hibernate:
- Entity
- Fetch
- JPQL
- SQL
1 июня, 10:00 — 11:30
11.1 Типы ссылок. Кэширование. ДЗ
Виды ссылок в Java
Пример самодельного кэша
Ehcache
5 июня, 20:00 — 21:30
Домашние задания: 1
ДЗ
Свой cache engine . Напишите свой cache engine с soft references.
Добавьте кэширование в DBService из задания про Hibernate ORM
11.2 No SQL
SQL базы данных
noSQL базы данных
SQL vs noSQL
MongoDB
MongoDB java, реактивное программирование в Java
8 июня, 10:00 — 11:30
12.1 Web сервер. ДЗ
Встроенный веб сервер.
Сервлеты: servlet API, жизненный цикл сервлета.
Jetty: устройство, работа, подключение сервлетов.
12 июня, 20:00 — 21:30
Домашние задания: 1
ДЗ
Веб сервер. Встроить веб сервер в приложение из ДЗ про Hibernate ORM.
Сделать админскую страницу, на которой админ должен авторизоваться.
На странице должны быть доступны следующие функции:
- создать пользователя
- получить список пользователей
12.2 Asynchronous Web applications
AJAX.
Long polling.
Websockets.
15 июня, 10:00 — 11:30
13.1 Dependency injection. ДЗ
Контейнер сервлетов: TomCat.
Spring IoC. Spring beans.
19 июня, 20:00 — 21:30
Домашние задания: 1
ДЗ
Приложение с IoC контейнером. Собрать war для приложения из предыдущего ДЗ.
Создавать кэш и DBService как Spring beans, передавать (inject) их в сервлеты.
Запустить веб приложение во внешнем веб сервере.
13.2 Логгирование
Что такое логгирование и для кого оно делается.
Современный подход к логгированию (SLF4J + LOGBack).
Простейший анализ логов.
22 июня, 10:00 — 11:30
Модуль 4: Многопоточность
14.1 Thread
Многопоточность.
Класс и объект Thread.
Создание многопоточного приложения.
Проблемы многопоточного доступа.
26 июня, 20:00 — 21:30
14.2 JMM. ДЗ
Основная проблема многопоточности
«Железные» оптимизации
«Программные» оптимизации
JMM
Volatile
Happens before
Lock-free алгоритмы, CAS
29 июня, 10:00 — 11:30
Домашние задания: 1
ДЗ
Последовательность чисел. Два потока печатают числа от 1 до 10, потом от 10 до 1.
Надо сделать так, чтобы числа чередовались, т.е. получился такой вывод:
Поток 1:1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1 2 3 4....
Поток 2: 1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1 2 3....
15.1 Message System. ДЗ
Потокобезопасные контейнеры.
Система обмена сообщениями.
3 июля, 20:00 — 21:30
Домашние задания: 1
ДЗ
MessageSystem. Добавить систему обмена сообщениями в ДЗ про веб сервер с IoC контейнером.
Пересылать сообщения из вебсокета в DBService и обратно.
Организовать структуру пакетов без циклических зависимостей.
15.2 Executors
Поддержка многопоточности в стандартной библиотеке.
Workers. Executors.
Fork/Join.
6 июля, 10:00 — 11:30
16.1 Многопроцессные приложения. ДЗ
Сокеты.
RMI.
Разбор примера многопроцессного приложения.
10 июля, 20:00 — 21:30
Домашние задания: 1
ДЗ
MessageServer. Cервер из предыдущего ДЗ про MessageSystem разделить на три приложения:
• MessageServer
• Frontend
• DBServer
Запускать Frontend и DBServer из MessageServer.
Сделать MessageServer сокет-сервером, Frontend и DBServer клиентами.
Пересылать сообщения с Frontend на DBService через MessageServer.

Запустить приложение с двумя серверами фронтенд и двумя серверами баз данных на разных портах.
Если у вас запуск веб приложения в контейнере, то MessageServer может копировать root.war в контейнеры при старте
16.2 NIO
Registration.
NIO для сокетов.
Проектная работа.
13 июля, 10:00 — 11:30
Проектная работа
Заключительный месяц курса посвящен проектной работе. Свой проект это то, что интересно писать студенту. То, что можно создать на основе знаний, полученных на курсе.
При этом не обязательно закончить его за месяц. В процессе написания по проекту можно получить консультации преподавателей.

Проект должен стать примером кода, который можно показывать потенциальным работодателям.

Примеры тем проекта:
- web сервер (разберите протокол)
- socket сервер на NIO (как netty)
- свой ORM
- распределенный кэш
- кэш для hibernate
17.1 Консультация по ДЗ и проектам
Домашние задания: 1
ДЗ
Проектная работа.
18.1 Консультация по ДЗ и проектам
Защита проектов

Преподаватель

Сергей Петрелевич
Java-разработчик в Технологическом центре Deutche Bank
В отрасли с 2003 года. Программировать начал со времен ZX-Spectrum. 8 лет в разработке банковских процессинговых систем пластиковых карт.

Занимался разработкой "коробочных" систем для внешних заказчиков, разработкой систем для внутренних заказчиков. В 2003 году с отличием закончил Магнитогорский Государственный Интститут им. Носова, специальность — промышленная электроника.

Компании: Магнитогорский Металлургический Комбинат, Компас+, Borlas, СМП Банк. Интересы: JavaScript, многопоточное программирование, сборщики мусора в Java.
Преподаватель курсов:
Разработчик Java