Несколько дней новогоднего волшебства:
Успейте начать обучение в 2018-ом году со скидкой до 30%!
Выбрать курс
Проходил 21 июня в 20:00

Открытый вебинар
Многопоточность в Java. Базовые примитивы синхронизации.

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

Рассмотрим, в чем сложность разработки многопоточных программ на Java.
Также обсудим базовые средства работы с потоками в JVM и ряд примеров, связанных с главой 17 JLS.
Преподаватель
Сергей Петрелевич

Запись

О курсе

Разработчик Java
60 000 ₽ 42 000 ₽
6 месяцев
Начало 26 декабря
  • Освоение разработки серверных приложений на Java.
  • Понимание библиотеки Java, особенностей языка и платформы Java.
  • Знание основных подходов к проектированию приложений, работе с базами, файлами, веб-фронтендом.
  • Владение низкоуровневыми и высокоуровневыми подходами к созданию многопоточных и многопроцессных приложений.
{{ employers_count }} {% pluralize employers_count 'работодатель' 'работодателя' 'работодателей' %}
большое количество практических заданий
Программа курса
Модуль 1
Язык и платформа Java
Модуль 2
Проектирование
Модуль 3
Работа с окружением
Модуль 4
Многопоточность
Модуль 5
Проектная работа
Язык и платформа Java
1.1 Подготовка к курсу
Введение. Обзор и задачи курса. Настройка окружения: система контроля версий git, система контроля зависимостей maven, среда разработки Intellij IDEA. Сборка и запуск java приложений.
26 декабря, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ 01. Сборка и запуск проекта. Создать проект под управлением maven в Intellij IDEA.

Добавить зависимость на Google Guava/Apache Commons/библиотеку на ваш выбор.
Использовать библиотечные классы для обработки входных данных.

Задать имя проекта (project_name) в pom.xml
Собрать project_name.jar содержащий все зависимости.
Проверить, что приложение можно запустить из командной строки.

Выложить проект на github.

Создать ветку "obfuscation" изменить в ней pom.xml, так чтобы сборка содержала стадию обфускации байткода.
1.2 Байт код
Байт код. Содержание .class. Декомпиляция. Обфускация. История изменений языка Java от версии к версии. Разбор ДЗ.
9 января, 20:00 — 21:30
2.1 Углубленные основы
Углубленные основы. Загрузка классов. Виды и задачи class loader-ов. Класс Class<?>. Примитивные типы, строки, массивы. Память, которую занимают объекты.
10 января, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ 02. Измерение памяти. Напишите стенд для определения размера объекта.
Передавайте для измерения в стенд фабрику объектов.

Определите размер пустой строки и пустых контейнеров. Определите рост размера контейнера от количества элементов в нем.

Если вы знакомы с инструментированием, сравните результаты измерениий.
2.2 Remote debug
Hot swap. Remote debug. Сборщик мусора. Instrumentation. Разбор примеров и ДЗ.
16 января, 20:00 — 21:30
3.1 Контейнеры и алгоритмы
Generics. Контейнеры и алгоритмы. Обзор устройства и работы контейнеров из java.util. Сравнение контейнеров. Карты на основе хэш функции и на основе дерева. Разбор алгоритмов из java.util.Collections.
17 января, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ 03. MyArrayList. Написать свою реализацию ArrayList на основе массива.

class MyArrayList<T> implements List<T>{...}

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

из java.util.Collections
3.2 Инструменты для преобразования контейнеров
Инструменты для преобразования контейнеров. Apache Commons. Google Guava. Разбор примеров и ДЗ.
23 января, 20:00 — 21:30
4.1 Сборщик мусора
Параметры запуска VM. Сборщик мусора. Виды сборок. Разделение памяти под разные поколения объектов. Виды сборщиков. JMX. Управление приложением из jconsole. OutOfMemory. dump памяти. Исседование thread dump и heap dump.
24 января, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ 04. Измерение активности GC. Написать приложение, которое следит за сборками мусора и пишет в лог количество сборок каждого типа (young, old) и время которое ушло на сборки в минуту.
Добиться OutOfMemory в этом приложении через медленное подтекание по памяти (например добавлять элементы в List и удалять только половину).
Настроить приложение (можно добавлять Thread.sleep(...)) так чтобы оно падало с OOM примерно через 5 минут после начала работы.
Собрать статистику (количество сборок, время на сборрки) по разным типам GC.
Сделать выводы.
4.2 QA и тестирование
QA, тестирование. Виды тестов. "Заглушки". Testing frameworks: junit, mockito. Разбор примеров и ДЗ.
30 января, 20:00 — 21:30
5.1 Аннотации
Аннотации. Стандартные аннотации. Применение аннотаций. Типы аннотаций. Синтаксис. Создание своих аннтатаций. Reflection.
31 января, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ 05. Тестовый фреймворк на аннотациях. Написать свой тестовый фреймворк.
Поддержать свои аннотации @Test, @Before, @After.
Запускать вызовом статического метода с именем класса с тестами.
5.2 Java 8
Элементы функционального программирования. Streams. Lambdas. Примеры.
6 февраля, 20:00 — 21:30
6.1 Типы ссылок. Кэширование
Типы ссылок в Java. Системы кэширования. Ehcache.
7 февраля, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ-06: my cache engine. Напишите свой cache engine с soft references.
6.2 Логгирование
java.util.logging, log4j, slf4j. Разбор примеров и ДЗ.
13 февраля, 20:00 — 21:30
Проектирование
7.1 Концепты проектирования ООП
Понятие дизайна приложения и паттерна проектирования. Концепты проектирования ООП: delegation, aggregation, composition, association, coupling and cohesion. SOLID.
14 февраля, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ 06. Написать эмулятор АТМ. Написать эмулятор АТМ (банкомата).

Объект класса АТМ должен уметь
• принимать банкноты разных номиналов (на каждый номинал должна быть своя ячейка)
• выдавать запрошенную сумму минимальным количеством банкнот или ошибку если сумму нельзя выдать
• выдавать сумму остатка денежных средств
7.2 Behavioral patterns
Behavioral patterns часть 1. Разбор примеров и ДЗ.
20 февраля, 20:00 — 21:30
8.1 Structural patterns
Behavioral patterns часть 2. Structural patterns.
21 февраля, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ 07. ATM Department. Написать приложение ATM Department:
• Приложение может содержать несколько ATM
• Departmant может собирать сумму остатков со всех ATM
• Department может инициировать событие – восстановить состояние всех ATM до начального.
(начальные состояния у разных ATM могут быть разными)
8.2 Creational patterns
Creational patterns. Связь между паттернами, "похожие" паттерны. Антипаттерны. Разбор примеров и ДЗ.
27 февраля, 20:00 — 21:30
Работа с окружением
9.1 Сериализация
Java IO. Сериализация. Запись и чтение бинарных файлов. Работа с simple-json, javax.json и com.google.code.gson.
28 февраля, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ-08: JSON object writer. Напишите свой json object writer (object to JSON string) аналогичный gson на основе javax.json или simple-json и Reflection.
Поддержите массивы объектов и примитивных типов, и коллекции из стандартный библиотерки.
9.2 XML
XML. Java NIO. Разбор примеров и ДЗ.
6 марта, 20:00 — 21:30
10.1 JDBC
Работа с реляционной базой. JDBC. ORM через паттерн Executor. JPA.
7 марта, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ-10: myORM. Создайте в базе таблицу с полями:
• id bigint(20) NOT NULL auto_increment
• name varchar(255)
• age int(3)

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

Напишите Executor, который сохраняет наследников DataSet в базу и читает их из базы по id и классу.

<T extends DataSet> void save(T user){…}
<T extends DataSet> T load(long id, Class<T> clazz){…}

Проверьте его работу на UserDataSet
10.2 myBatis
Inmemory базы. myBatis. Разбор примеров и ДЗ.
13 марта, 20:00 — 21:30
11.1 Hibernate
Hibernate. Конфигурирование Hibernate в коде и в XML. Java persistency query language. DBSevice pattern.
14 марта, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ-11: Hibernate ORM. На основе ДЗ 10:
1. Оформить решение в виде DBService (interface DBService, class DBServiceImpl, UsersDAO, UsersDataSet, Executor)
2. Не меняя интерфейс DBSerivice сделать DBServiceHibernateImpl на Hibernate.
3. Добавить в UsersDataSet поля:
адресс (OneToOne)
class AddressDataSet{
private String street;
}
и телефон* (OneToMany)
class PhoneDataSet{
private String number;
}
Добавить соответствущие датасеты и DAO.
* можно не поддерживать в ДЗ 10
11.2 JPQL
Connection Pools. JPQL. Разбор примеров и ДЗ.
20 марта, 20:00 — 21:30
12.1 Web сервер
Встроенный веб сервер. Сервлеты: servlet API, жизненный цикл сервлета. Jetty: устройство, работа, подключение сервлетов.
21 марта, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ-12: Веб сервер. Встроить веб сервер в приложение из ДЗ-11.
Сделать админскую страницу, на которой можно добавить пользователя, получить имя пользователя по id и получить количество пользователей в базе.
12.3 No SQL
No SQL. Работа с MongoDB. Разбор примеров и ДЗ.
27 марта, 20:00 — 21:30
Многопоточность
13.1 Thread
Многопоточность. Класс и объект Thread. Создание многопоточного приложения. Проблемы многопоточного доступа.
28 марта, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ-14: Многопоточная сортировка. Написать приложение, которое сортирует массив чисел в 4 потоках с использованием библиотеки или без нее.
13.2 JMM
Happens before. Cooperation. Atomics.
3 апреля, 20:00 — 21:30
14.1 Dependency injection
Web archive. Jetty as an external web server. Spring IoC. Spring beans.
4 апреля, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ-13: WAR. Собрать war для приложения из ДЗ-12.
Создавать кэш и DBService как Spring beans, передавать (inject) их в сервлеты.
Запустить веб приложение во внешнем веб сервере.
14.2 Asynchronous Web applications
AJAX. Long polling. Websockets. Разбор примеров из ДЗ.
10 апреля, 20:00 — 21:30
15.1 Message System
Потокобезопасные контейнеры.Система обмена сообщениями.
11 апреля, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ-15: MessageSystem. Добавить систему обмена сообщениями в веб сервер из ДЗ-13.
Пересылать сообщения из вебсокета в DBService и обратно.
Организовать структуру пакетов без циклических зависимостей.
15.2 Executors
Поддержка многопоточности в стандартной библиотеке. Workers. Executors. Fork/Join. Разбор примеров и ДЗ.
17 апреля, 20:00 — 21:30
16.1 Многопроцессные приложения
Сокеты. RMI. Разбор примера многопроцессного приложения.
18 апреля, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ-16: MessageServer. Cревер из ДЗ-15 разделить на три приложения:
• MessageServer
• Frontend
• DBServer
Запускать Frontend и DBServer из MessageServer.
Сделать MessageServer сокет-сервером, Frontend и DBServer клиентами.
Пересылать сообщения с Frontend на DBService через MessageServer.
Запустить приложение с двумя фронтендами (на разных портах)* и двумя датабазными серверами.

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

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

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

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

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

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

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