Тема  9. Взаимодействие потоков

Содержание

  1. Синхронизация и блокировки
    1. Синхронизация
    2. Неявные блокировки
    3. Активное ожидания
  2. Мониторы и условия
    1. Мониторы
    2. Условия и работа с ними
    3. Пассивное ожидание
    4. Внезапные пробуждения
  3. Модель памяти Java
    1. Атомарность операций
    2. Видимость изменений и барьеры
    3. Упорядоченность изменений
    4. Volatile-переменные
  4. Примеры многопоточных программ
    1. Двусторонний барьер
    2. Гарантированный тупик
  5. Уровни безопасности
    1. Неизменяемые объекты
    2. Потокобезопасные объекты
    3. Потоконебезопасные объекты
    4. Thread-local objects

Слайды

HTML

Примеры

zip

Домашнее задание 9. Параллельный запуск

  1. Напишите класс ParallelMapperImpl, реализующий интерфейс ParallelMapper.
    public interface ParallelMapper extends AutoCloseable {
        <T, R> List<R> map(
            Function<? super T, ? extends R> f,
            List<? extends T> args
        ) throws InterruptedException;
    
        @Override
        void close();
    }
    
    • Метод map должен параллельно вычислять функцию f на каждом из указанных аргументов (args).
    • Конструктор ParallelMapperImpl(int threads) должен создавать threads рабочих потоков, которые используются для распараллеливания.
    • Метод close должен останавливать все рабочие потоки.
    • К одному ParallelMapperImpl могут одновременно обращаться несколько клиентов.
    • При недостатке потоков для распараллеливания, задания на исполнение должны накапливаться в очереди и обрабатываться в порядке поступления.
    • В реализации не должно быть активных ожиданий.
    • Код должен находиться в пакете iterative.
    • Обратите внимание на обработку исключений, кидаемых функцией f.
      1. Исключения не должны приводить к сокращению числа рабочих потоков.
      2. Сложный вариант. Исключения должны выкидываться из метода map.
  2. Доработайте класс IterativeParallelism так, чтобы он мог использовать ParallelMapper.
    • Добавьте конструктор IterativeParallelism(ParallelMapper).
    • Методы класса должны делить работу на threads фрагментов и исполнять их при помощи ParallelMapper.
    • При наличии ParallelMapper сам IterativeParallelism новые потоки создавать не должен.
    • Должна быть возможность одновременного запуска и работы нескольких клиентов, использующих один ParallelMapper.
  3. При выполнении задания всё ещё нельзя использовать Concurrency Utilities и Parallel Streams.

Библиография

  1.  Java Language Specification. Theads and locks
  2.  Concurrency (Java Tutorial)
  3. Lea D. Concurrent Programming in Java
  4. Goetz B. Java Concurrency in Practice
  5. Garg V. Concurrent and Distributed Computing in Java