|
18 | 18 | - используя асинхронные сервлеты 3.0 |
19 | 19 | - сохранение данных в PostgreSQL используя [jDBI](http://jdbi.org/) |
20 | 20 | - миграция базы [LiquiBase](http://www.liquibase.org/) |
21 | | -- использование в проекте [Guava](https://github.com/google/guava/wiki), [Thymleaf](http://www.thymeleaf.org/), [Lombook](https://projectlombok.org/), [StreamEx](https://github.com/amaembo/streamex), |
| 21 | +- использование в проекте [Guava](https://github.com/google/guava/wiki), [Thymleaf](http://www.thymeleaf.org/), [Lombok](https://projectlombok.org/), [StreamEx](https://github.com/amaembo/streamex), |
22 | 22 | [Typesafe Config](https://github.com/typesafehub/config), [Java Microbenchmark JMH](http://openjdk.java.net/projects/code-tools/jmh) |
23 | 23 |
|
24 | 24 | ### Требование к участникам |
|
38 | 38 | > В видео в `LazySingleton` ошибка: должно быть как в коде проекта `instance == null` |
39 | 39 |
|
40 | 40 | ### Структура памяти: куча, стек, permanent/metaspace |
41 | | - - <a href="https://www.slideshare.net/solit/jvm-16948708">JVM изнутри - оптимизация и профилирование</a>. |
| 41 | + - <a href="https://documents.tips/technology/jvm-.html">JVM изнутри - оптимизация и профилирование</a>. |
42 | 42 | - <a href="http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap#24171266">Stack and Heap</a> |
43 | 43 | - Дополнительно: |
44 | 44 | - <a href="http://habrahabr.ru/post/117274/">Из каких частей состоит память java процесса</a>. |
45 | 45 | - <a href="http://www.javaspecialist.ru/2011/04/permanent.html">Permanent область памяти</a> |
46 | 46 | - <a href="http://www.javaspecialist.ru/2011/04/java-thread-stack.html">Java thread stack </a> |
47 | 47 | - <a href="http://habrahabr.ru/post/134102/">Размер Java объектов</a> |
| 48 | + - Оптимизация памяти |
| 49 | + - [Escape analysis и скаляризация: Пусть GC отдохнет](https://habr.com/company/jugru/blog/322348) |
| 50 | + - [Условия для размещения объекта в стеке](https://stackoverflow.com/a/43002529/548473) |
48 | 51 |
|
49 | 52 | ### Ленивая инициализация |
50 | 53 | - <a href="https://habrahabr.ru/post/27108/">Реализация Singleton в JAVA</a> |
|
64 | 67 | - <a href="http://articles.javatalks.ru/articles/17">Использование ThreadLocal переменных</a> |
65 | 68 | - <a href="https://www.youtube.com/watch?v=8piqauDj2yo">Николай Алименков — Прикладная многопоточность</a> |
66 | 69 | - <a href="http://stackoverflow.com/questions/20163056/in-java-can-thread-switching-happen-in-the-synchronized-block">Can thread switching happen in the synchronized block?</a> |
| 70 | +- [Реактивное программирование - как, зачем и стоит ли?](https://habr.com/ru/company/oleg-bunin/blog/543386/) |
67 | 71 |
|
68 | 72 | #### Tproger: Многопоточное программирование в Java 8 |
69 | 73 | - <a href="https://tproger.ru/translations/java8-concurrency-tutorial-1/">1. Параллельное выполнение кода с помощью потоков</a> |
|
73 | 77 | ##  4. <a href="https://www.youtube.com/watch?v=AEhIh2qd-FM">Реализация многопоточной отправки писем. Execution Framework</a> |
74 | 78 | > правка к видео: `22: completionService.submit(..)` |
75 | 79 |
|
76 | | -###  Все изменения в проекте будут делаться на основе патчей |
77 | | -#### Скачайте [1_1_MailService.patch](https://drive.google.com/open?id=0B9Ye2auQ_NsFTE5ZV3pzWElxTWM), положите его в проект, правой мышкой на нем сделайте Apply Patch ... |
| 80 | +Вычекать этот проект: |
| 81 | +```git clone https://github.com/JavaOPs/masterjava.git``` |
| 82 | + |
| 83 | +> - [Настройка git на свой репозиторий](https://github.com/JavaOPs/basejava/blob/master/lesson/lesson1.md#настройка-проекта) |
| 84 | +> - [Правила работы с патчами на проекте](https://github.com/JavaOPs/topjava/wiki/Git) |
| 85 | +
|
| 86 | +#### Все изменения в проекте будут делаться на основе патчей: скачайте [1_1_MailService.patch](https://drive.google.com/open?id=0B9Ye2auQ_NsFTE5ZV3pzWElxTWM), положите его в проект, правой мышкой на нем сделайте Apply Patch ... |
78 | 87 |
|
79 | 88 | ---------------------------- |
| 89 | +- [Как сделать Java код проще и нагляднее](https://habrahabr.ru/company/wrike/blog/349652/) |
80 | 90 |
|
81 | 91 | ### Ресурсы (основы) |
82 | 92 | - Intuit, <a href="http://www.intuit.ru/studies/courses/16/16/lecture/27127">Потоки выполнения. Синхронизация</a> |
|
85 | 95 | - Computer Science Center, курс <a href="https://compscicenter.ru/courses/hp-course/2016-spring">Параллельное программирование</a> |
86 | 96 | - Юрий Ткач, курс <a href="https://www.youtube.com/playlist?list=PL6jg6AGdCNaXo06LjCBmRao-qJdf38oKp">Advanced Java - Concurrency</a> |
87 | 97 | - Головач, курс <a href="https://www.youtube.com/playlist?list=PLoij6udfBncgVRq487Me6yQa1kqtxobZS">Java Multithreading</a> |
88 | | - |
| 98 | +- [Перевод «Java Memory Model»](https://habr.com/ru/post/510454/) |
89 | 99 | --- |
90 | 100 | ##  Задание первого занятия |
91 | 101 |
|
92 | | -Вычекать этот проект: |
93 | | -```git clone https://github.com/JavaOPs/masterjava.git``` |
94 | | - |
95 | 102 | - Применить <a href="https://habrahabr.ru/post/114797/">оптимизацию</a> к MatrixUtil.singleThreadMultiply |
96 | 103 | - Реализовать метод `MatrixUtil.concurrentMultiply`, позволяющий многопоточно <a href="https://ru.wikipedia.org/wiki/Умножение_матриц">перемножать квадратные матрицы N*N</a>. |
97 | 104 | - Количество дочерних потоков ограничено `MainMatrix.THREAD_NUMBER`. |
98 | 105 | - Добиться того, чтобы на матрице 1000*1000 многопоточная реализация была быстрее однопоточной |
99 | 106 |
|
100 | 107 | ----- |
101 | 108 | ##  Подсказки по HW1 |
102 | | -- не делайте 1000 000 тасок, лучше их сделать крупнее |
103 | | -- у меня разница между 4 и 1000 тасками по времени незаметна, поэтому делайте просто и не делайте сложно |
104 | | -- наконец: можно не считать значение элемента результирующей матрицы C за раз, а накапливать (`concurrentMultiply3`). Мои результаты: |
| 109 | +- 1: не делайте 1000 000 тасок, лучше их сделать крупнее |
| 110 | +- 2: у меня разница между 4 и 1000 тасками по времени незаметна, поэтому делайте просто и не делайте сложно |
| 111 | +- 3: наконец: можно не считать значение элемента результирующей матрицы C за раз, а накапливать (`concurrentMultiply3`). Тогда трансформация B не нужна. Мои результаты: |
105 | 112 | ``` |
106 | 113 | Benchmark (matrixSize) Mode Cnt Score Error Units |
107 | 114 | MatrixBenchmark.singleThreadMultiplyOpt 1000 ss 100 837,867 ± 25,530 ms/op |
@@ -134,14 +141,14 @@ MatrixBenchmark.concurrentMultiply3 1000 ss 100 186,827 ± 11,882 |
134 | 141 | - Maven. Поиск и разрешение конфликтов зависимостей |
135 | 142 | - Подключаем логирование с общими настройкам |
136 | 143 | - Библиотеки и фреймворки для работы с JDBC. |
137 | | -- Модуль persist |
| 144 | +- Модуль persistence |
138 | 145 |
|
139 | 146 | ## Занятие 5 |
140 | 147 | - Разбор ДЗ |
141 | 148 | - Сохранение в базу в batch-моде с обработкой конфликтов |
142 | 149 | - Вставка в несколько потоков |
143 | 150 | - Конфигурирование приложения (<a href="https://github.com/typesafehub/config">Typesafe config</a>) |
144 | | -- Lombook |
| 151 | +- Lombok |
145 | 152 |
|
146 | 153 | ## Занятие 6 |
147 | 154 | - Разбор ДЗ (доработка модели и модуля export) |
|
0 commit comments