Отзывы о первом издании....21
Предисловие....22
Введение....24
Благодарности....27
Об этой книге....30
Для кого эта книга....30
Как использовать эту книгу....31
О коде....32
Форум liveBook....33
Другие сетевые ресурсы....33
Об авторах....34
Иллюстрация на обложке....35
От издательства....36
Часть I От 8 до 11 и дальше....37
Глава 1. Современный язык Java....38
1.1. Язык и платформа....39
1.2. Новый цикл выпуска Java....41
1.3. Расширенное выведение типов (синтаксис var)....45
1.4. Изменения языка и платформы....49
1.4.1. Синтаксический сахар....50
1.4.2. Изменения языка....50
1.4.3. Документы JSR и JEP....51
1.4.4. Инкубационная и предварительная функциональность....52
1.5. Небольшие изменения в Java 11....53
1.5.1. Фабрики коллекций (JEP 213)....53
1.5.2. Удаление корпоративных модулей (JEP 320)....55
1.5.3. HTTP/2 (Java 11)....56
1.5.4. Однофайловое выполнение (JEP 330)....61
Итоги....63
Глава 2. Модули Java....64
2.1. Модули Java: общая картина....65
2.1.1. Проект Jigsaw....66
2.1.2. Граф модулей....69
2.1.3. Защита внутреннего устройства....71
2.1.4. Новая семантика управления доступом....72
2.2. Основы синтаксиса модулей....73
2.2.1. exports и requires....75
2.2.2. Транзитивность....76
2.3. Загрузка модулей....77
2.3.1. Платформенные модули....78
2.3.2. Прикладные модули....78
2.3.3. Автоматические модули....79
2.3.4. Анонимные модули....79
2.4. Создание первого модульного приложения....80
2.4.1. Параметры командной строки для модулей....81
2.4.2. Выполнение модульного приложения....83
2.4.3. Модули и рефлексия....85
2.5. Проектирование архитектуры для модулей....86
2.5.1. Расщепленные пакеты....87
2.5.2. Компактные профили Java 8....88
2.5.3. Многоверсионные файлы JAR....90
2.6. Не только модули....93
Итоги....95
Глава 3. Java 17....97
3.1. Текстовые блоки....97
3.2. Выражения switch....99
3.3. Записи....103
3.3.1. Номинативная типизация....109
3.3.2. Компактные конструкторы записей....110
3.4. Запечатанные типы....113
3.5. Новая форма instanceof....118
3.6. Сопоставление с шаблонами и предварительная функциональность....119
Итоги....122
Часть II Что там внутри?....123
Глава 4. Файлы классов и байт-код....124
4.1. Загрузка классов и объекты классов....125
4.1.1. Загрузка и компоновка....126
4.1.2. Объекты Class....129
4.2. Загрузчики классов....130
4.2.1. Нестандартная загрузка классов....132
4.2.2. Модули и загрузка классов....140
4.3. Анализ файлов классов....140
4.3.1. Введение в javap....141
4.3.2. Внутренняя форма сигнатур методов....141
4.3.3. Пул констант....143
4.4. Байт-код....146
4.4.1. Дизассемблирование классов....146
4.4.2. Среда выполнения....149
4.4.3. Введение в коды операций....150
4.4.4. Операции загрузки и сохранения....152
4.4.5. Арифметические операции....153
4.4.6. Операции управления порядком выполнения....154
4.4.7. Операции вызова....155
4.4.8. Платформенные операции....158
4.4.9. Сокращенные формы кодов операций....159
4.5. Рефлексия....159
4.5.1. Введение в рефлексию....160
4.5.2. Загрузка классов в сочетании с рефлексией....163
4.5.3. Проблемы с рефлексией....163
Итоги....165
Глава 5. Основы конкурентности в Java....166
5.1. Краткий курс конкурентности....167
5.1.1. Но я уже знаю о Thread....167
5.1.2. Оборудование....168
5.1.3. Закон Амдала....169
5.1.4. Потоковая модель Java....170
5.1.5. Полезный опыт....171
5.2. Факторы проектирования....172
5.2.1. Безопасность и конкурентная типобезопасность....172
5.2.2. Живость....173
5.2.3. Производительность....174
5.2.4. Повторное использование....174
5.2.5. Как и почему возникают конфликты между факторами?....174
5.2.6. Источники затрат....175
5.3. Конкурентное выполнение с блоковой структурой (до Java 5)....176
5.3.1. Синхронизация и блокировки....176
5.3.2. Модель состояний потока....178
5.3.3. Полностью синхронизированные объекты....180
5.3.4. Взаимная блокировка....181
5.3.5. Почему synchronized?....184
5.3.6. Ключевое слово volatile....186
5.3.7. Состояния и методы потока....187
5.3.8. Неизменяемость....193
5.4. Модель памяти Java (JMM)....197
5.5. Конкурентность в байт-коде....200
5.5.1. Потерянное обновление....201
5.5.2. Синхронизация в байт-коде....204
5.5.3. Синхронизированные методы....208
5.5.4. Несинхронизированное чтение....209
5.5.5. Снова о взаимной блокировке....211
5.5.6. Снова об устранении взаимных блокировок....213
5.5.7. Обращения к volatile....218
Итоги....220
Глава 6. Конкурентные библиотеки Java....221
6.1. Структурные элементы современных конкурентных приложений....221
6.2. Атомарные классы....222
6.3. Классы Lock....224
6.3.1. Объекты условий....226
6.4. CountDownLatch....226
6.5. ConcurrentHashMap....228
6.5.1. Упрощенное представление HashMap....228
6.5.2. Ограничения Dictionary....232
6.5.3. Конкурентная реализация Dictionary....232
6.5.4. ConcurrentHashMap....235
6.6. CopyOnWriteArrayList....238
6.7. Блокирующие очереди....241
6.7.1. Интерфейсы BlockingQueue....247
6.7.2. WorkUnit....249
6.8. Преднамеченные объекты....250
6.8.1. CompletableFuture....252
6.9. Задачи и выполнение....254
6.9.1. Моделирование задач....255
6.9.2. Исполнители....256
6.9.3. Однопоточный исполнитель....257
6.9.4. Пул фиксированного размера....258
6.9.5. Пул потоков с кэшированием....259
6.9.6. ScheduledThreadPoolExecutor....260
Итоги....261
Глава 7. Производительность кода на Java....262
7.1. Терминология производительности: основные определения....265
7.1.1. Задержка....265
7.1.2. Пропускная способность....265
7.1.3. Загруженность....266
7.1.4. Эффективность....266
7.1.5. Емкость....267
7.1.6. Масштабируемость....267
7.1.7. Деградация....267
7.2. Прагматичный подход к анализу производительности....268
7.2.1. Понимайте, что измеряете....268
7.2.2. Как выполнять измерения....269
7.2.3. Установите цели по быстродействию....271
7.2.4. Знайте, когда остановиться....271
7.2.5. Учитывайте цену повышения быстродействия....272
7.2.6. Преждевременная оптимизация опасна....272
7.3. Что пошло не так? Почему мы должны этим заниматься?....274
7.3.1. Закон Мура....274
7.3.2. Иерархия задержек памяти....276
7.4. Почему так сложно оптимизировать производительность кода на Java?....278
7.4.1. Роль времени в оптимизации производительности....279
7.4.2. Промахи кэша....280
7.5. Сборка мусора....282
7.5.1. Основы....282
7.5.2. Пометка и очистка....283
7.5.3. Области памяти....285
7.5.4. Сборка мусора в молодом поколении....286
7.5.5. Полная сборка мусора....286
7.5.6. Безопасные точки....286
7.5.7. G1: сборщик мусора по умолчанию в Java....287
7.5.8. Сборщик мусора Parallel....289
7.5.9. Параметры конфигурации сборщика мусора....290
7.6. JIT-компиляция с HotSpot....292
7.6.1. Зачем нужна динамическая компиляция?....293
7.6.2. Введение в HotSpot....293
7.6.3. Встраивание методов....295
7.6.4. Динамическая компиляция и мономорфные вызовы....295
7.6.5. Чтение журналов компиляции....296
7.6.6. Деоптимизация....297
7.7. JDK Flight Recorder....298
7.7.1. Flight Recorder....298
7.7.2. Mission Control....300
Итоги....306
Часть III Другие языки на JVM....307
Глава 8. Альтернативные языки на JVM....308
8.1. Классификация языков....309
8.1.1. Интерпретируемые и компилируемые языки....309
8.1.2. Динамическая и статическая типизация....310
8.1.3. Императивные и функциональные языки....311
8.1.4. Оригинал и повторная реализация....312
8.2. Многоязычное программирование на JVM....314
8.2.1. Зачем нужны другие языки?....315
8.2.2. Перспективные языки....317
8.2.3. Языки, которые мы могли выбрать (но не выбрали)....318
8.3. Как выбрать альтернативный язык для проекта....320
8.3.1. Является ли область проекта низкорискованной?....321
8.3.2. Насколько просто язык взаимодействует с Java?....322
8.3.3. Насколько развита инструментальная и тестовая поддержка для языка?....323
8.3.4. Легко ли изучить язык?....323
8.3.5. Насколько популярен этот язык среди разработчиков?....324
8.4. Как JVM поддерживает альтернативные языки....324
8.4.1. Производительность....325
8.4.2. Среды выполнения для альтернативных языков....326
8.4.3. Фикции компилятора....326
Итоги....328
Глава 9. Kotlin....329
9.1. Почему стоит использовать Kotlin....330
9.1.1. Установка....330
9.2. Удобство и компактность....330
9.2.1. Начиная с меньшего....331
9.2.2. Переменные....331
9.2.3. Проверка равенства....332
9.2.4. Функции....333
9.2.5. Коллекции....336
9.2.6. Выражения....339
9.3. Новый взгляд на классы и объекты....341
9.3.1. Классы данных....347
9.4. Безопасность....348
9.4.1. Null-безопасность....348
9.4.2. Умное приведение типа....350
9.5. Конкурентность....352
9.6. Совместимость с Java....355
Итоги....359
Глава 10. Clojure: другой взгляд на программирование....360
10.1. Введение в Clojure....361
10.1.1. Программа «Hello World» на Clojure....363
10.1.2. Основы работы с REPL....365
10.1.3. Ошибки....367
10.1.4. Привыкаем к круглым скобкам....370
10.2. Clojure: синтаксис и семантика....371
10.2.1. Краткий курс специальных форм....371
10.2.2. Списки, векторы, отображения и множества....374
10.2.3. Арифметические действия, проверка равенства и другие операции....378
10.2.4. Работа с функциями в Clojure....379
10.2.5. Циклы в Clojure....383
10.2.6. Макросы считывателя и диспетчеризация....384
10.3. Функциональное программирование и замыкания....386
10.4. Знакомство с последовательностями Clojure....388
10.4.1. Последовательности и функции переменной арности....393
10.5. Взаимодействие между Clojure и Java....394
10.5.1. Вызов Java из Clojure....395
10.5.2. Как устроены вызовы Clojure....396
10.5.3. Тип Java для значений Clojure....396
10.5.4. Заместители в Clojure....397
10.5.5. Исследовательское программирование в REPL....398
10.5.6. Использование Clojure из Java....399
10.6. Макросы....400
Итоги....406
Часть IV Сборка и развертывание....407
Глава 11. Сборка в Gradle и Maven....408
11.1. Почему средства сборки важны для опытного разработчика....408
11.1.1. Автоматизация рутинных операций....409
11.1.2. Управление зависимостями....409
11.1.3. Согласование усилий разработчиков....413
11.2. Maven....414
11.2.1. Жизненный цикл сборки....414
11.2.2. Команды и знакомство с POM....415
11.2.3. Сборка....417
11.2.4. Управление манифестом....418
11.2.5. Добавление нового языка....419
11.2.6. Тестирование....422
11.2.7. Управление зависимостями....425
11.2.8. Анализ покрытия....429
11.2.9. За пределами Java 8....430
11.2.10. Многоверсионные файлы JAR в Maven....431
11.2.11. Maven и модули....435
11.2.12. Разработка плагинов для Maven....438
11.3. Gradle....441
11.3.1. Установка Gradle....442
11.3.2. Задачи....443
11.3.3. Сценарии сборки....444
11.3.4. Использование плагинов....445
11.3.5. Сборка....445
11.3.6. Эффективность....448
11.3.7. Зависимости в Gradle....449
11.3.8. Добавление кода на Kotlin....454
11.3.9. Тестирование....455
11.3.10. Автоматизация статического анализа....456
11.3.11. За пределами Java 8....457
11.3.12. Gradle и модули....458
11.3.13. Настройка Gradle....465
Итоги....467
Глава 12. Выполнение Java в контейнерах....469
12.1. Почему контейнеры важны для опытных разработчиков....470
12.1.1. Управляющие операционные системы, виртуальные машины и контейнеры....470
12.1.2. Преимущества контейнеров....473
12.1.3. Недостатки контейнеров....474
12.2. Основы работы с Docker....475
12.2.1. Построение образов Docker....475
12.2.2. Запуск контейнеров Docker....478
12.3. Разработка приложений на Java с Docker....480
12.3.1. Выбор базового образа....481
12.3.2. Сборка образа в Gradle....482
12.3.3. Сборка в Docker....483
12.3.4. Порты и узлы....486
12.3.5. Локальная разработка с Docker Compose....488
12.3.6. Отладка в Docker....491
12.3.7. Протоколирование в Docker....493
12.4. Kubernetes....495
12.5. Наблюдаемость и производительность....503
12.5.1. Наблюдаемость....503
12.5.2. Производительность в контейнерах....506
Итоги....507
Глава 13. Основы тестирования....509
13.1. Зачем нужно тестирование....509
13.2. Как проводить тестирование....510
13.3. Разработка через тестирование....514
13.3.1. TDD в двух словах....516
13.3.2. Пример TDD с одним сценарием использования....516
13.4. Тестовые дублеры....522
13.4.1. Пустышка....523
13.4.2. Заглушка....525
13.4.3. Суррогаты....527
13.4.4. Макеты....530
13.4.5. Проблемы с макетами....531
13.5. От JUnit 4 к 5....533
Итоги....539
Глава 14. Тестирование за пределами JUnit....540
14.1. Интеграционное тестирование с Testcontainers....540
14.1.1. Установка testcontainers....541
14.1.2. Пример с Redis....541
14.1.3. Получение логов контейнеров....545
14.1.4. Пример с Postgres....546
14.1.5. Пример сквозного тестирования с Selenium....548
14.2. Спецификационное тестирование в Spek и Kotlin....550
14.3. Тестирование на основе свойств в Clojure....556
14.3.1. clojure.test....556
14.3.2. clojure.spec....558
14.3.3. test.check....561
14.3.4. clojure.spec и test.check....567
Итоги....568
Часть V Передовые рубежи Java....569
Глава 15. Продвинутое функциональное программирование....570
15.1. Введение в понятия функционального программирования....571
15.1.1. Чистые функции....571
15.1.2. Неизменяемость....571
15.1.3. Функции высшего порядка....572
15.1.4. Рекурсия....573
15.1.5. Замыкания....574
15.1.6. Отложенные вычисления....574
15.1.7. Каррирование и частичное применение....575
15.2. Ограничения функционального программирования на Java....576
15.2.1. Чистые функции....576
15.2.2. Изменяемость....577
15.2.3. Функции высшего порядка....579
15.2.4. Рекурсия....580
15.2.5. Замыкания....583
15.2.6. Отложенные вычисления....585
15.2.7. Каррирование и частичное применение....587
15.2.8. Система типов Java и коллекции....588
15.3. Функциональное программирование на Kotlin....590
15.3.1. Чистые функции и функции высшего порядка....590
15.3.2. Замыкания....591
15.3.3. Каррирование и частичное применение....592
15.3.4. Неизменяемость....593
15.3.5. Хвостовая рекурсия....596
15.3.6. Отложенное вычисление....600
15.3.7. Последовательности....601
15.4. Функциональное программирование на Clojure....606
15.4.1. Включения....606
15.4.2. Отложенные последовательности....607
15.4.3. Каррирование в Clojure....610
Итоги....611
Глава 16. Продвинутое конкурентное программирование....612
16.1. Фреймворк Fork/Join....613
16.1.1. Простой пример F/J....614
16.1.2. Параллелизация задач для F/J....617
16.1.3. Алгоритмы перехвата работы....618
16.2. Конкурентность и функциональное программирование....620
16.2.1. Снова о CompletableFuture....620
16.2.2. Параллельные потоки данных....624
16.3. Как работают корутины Kotlin....626
16.3.1. Как работают корутины....626
16.3.2. Области видимости и диспетчеризация корутин....631
16.4. Конкурентное выполнение в Clojure....633
16.4.1. Перманентные структуры данных....634
16.4.2. Преднамеченные объекты и pcalls....641
16.4.3. Программная транзакционная память....643
16.4.4. Агенты....647
Итоги....648
Глава 17. Внутреннее устройство современной JVM....649
17.1. Знакомство с внутренним устройством JVM: вызов методов....650
17.1.1. Вызов виртуальных методов....650
17.1.2. Вызов методов интерфейсов....653
17.1.3. Вызов «специальных» методов....655
17.1.4. Конечные методы....656
17.2. Внутренняя реализация рефлексии....657
17.3. Дескрипторы методов....661
17.3.1. MethodHandle....662
17.3.2. MethodType....663
17.3.3. Как получать дескрипторы методов....664
17.3.4. Рефлексия, заместители и дескрипторы методов....665
17.4. invokedynamic....668
17.4.1. Реализация лямбда-выражений....670
17.5. Небольшие внутренние изменения....673
17.5.1. Конкатенация строк....673
17.5.2. Компактные строки....675
17.5.3. Общие контексты....677
17.6. Unsafe....680
17.7. Замена Unsafe поддерживаемыми API....684
17.7.1. VarHandle....685
17.7.2. Скрытые классы....687
Итоги....689
Глава 18. Будущее Java....690
18.1. Проект Amber....691
18.2. Проект Panama....693
18.2.1. API внешних функций и памяти....693
18.3. Проект Loom....700
18.3.1. Виртуальные потоки....704
18.3.2. Строители потоков....705
18.3.3. Программирование с помощью виртуальных потоков....706
18.3.4. Когда проект Loom станет доступным?....708
18.4. Проект Valhalla....709
18.4.1. Изменение модели языка....713
18.4. Последствия внедрения объектов-значений....714
18.4.3. Снова об обобщениях....717
18.5. Java 18....718
Итоги....718
Приложения....721
Приложение А. Выбор версии Java....722
A.1. Java остается бесплатным....722
A.1.1. Java SE / OpenJDK / Сборки Oracle OpenJDK / Oracle JDK....722
A.2. Для тех, кто остается на Java SE 8....723
A.2.1. Бесплатное использование Java SE 8....723
A.3. Как получить Java SE 11....723
A.3.1. Бесплатное использование Java SE 11....724
A.4. Как получить Java SE 17 (LTS)....724
A.4.1. Бесплатное использование Java SE 17....724
A.5. Платная поддержка....724
Приложение Б. Потоки данных в Java 8....725
Б.1. Обратная совместимость....725
Б.2. Методы по умолчанию....726
Б.3. Потоки данных....727
Б.3.1. Пример....728
Б.4. Ограничения коллекций....731
Б.5. Бесконечные потоки данных....732
Б.6. Работа с примитивами....732
Б.7. Параллельные операции?....733
Язык Java – сердце корпоративного ПО. Если программист хорошо знает Java, он без особого труда найдет интересную работу. Поднимите ваши навыки Java на новый уровень вместе с экспертами. Основательно изучите такие мощные инструменты, как модели конкурентного выполнения и модули, и даже раскройте некоторые глубинные тайны Java.Узнайте, как Java работает на уровне байт-кода. Освойте ценные приемы конкурентного выполнения и оптимизации быстродействия, а еще ключевые методы сборки, тестирования и развертывания. Также рассмотрите альтернативные языки для JVM – Kotlin и Clojure. Изучив материал, вы будете выделяться на фоне других разработчиков!