Java Advanced Многопоточное программирование. Concurrency Utilities Содержание СПбГУ ИТМО Многопоточные коллекции Примитивы синхронизации Атомарный операции Блокировки Управление заданиями Дополнительные возможности Заключение Georgiy Korneev Java Advanced / Concurrency Utilities 2 Concurrency Utilities СПбГУ ИТМО Набор классов, облегчающих написание многопоточных программ Пакет java.util.concurrent Пакет java.util.concurrent.locks Многопоточные коллекции Примитивы синхронизации Управление заданиями Работа с блокировками Пакет java.util.concurrent.atomic Атомарные переменные Georgiy Korneev Java Advanced / Concurrency Utilities 3 Часть 1 Многопоточные коллекции Многопоточные очереди Интерфейс BlockingQueue Отличие от обычных очередей Возможно ограничение размера Методы добавления могут бросают IllegalStateException Дополнительные операции Georgiy Korneev Java Advanced / Collections Framework 5 Дополнительные операции Добавление элемента Удаление элемента put(E) – блокируется до появление места. offer(E, timeout, unit) – блокируется на время. take() – блокируется до появления элемента. poll(E, timeout, unit) – блокируется на время. Получение нескольких элементов drainTo(Collection) – получение всех элементов. drainTo(Collection, max) – получение max элементов. Georgiy Korneev Java Advanced / Collections Framework 6 Производитель-потребитель (1) Производитель void run() { try { while (true) { E e; // Создание элемента queue.put(e); } } catch (InterruptedException e) { } } Georgiy Korneev Java Advanced / Collections Framework 7 Производитель-потребитель (2) Потребитель void run() { try { while (true) { E e = queue.take(); // Обработка элемента } } catch (InterruptedException e) { } } Georgiy Korneev Java Advanced / Collections Framework 8 Реализации BlockingQueue ArrayBlockingQueue – очередь на массиве LinkedBlockingQueue – очередь на списке PriorityBlockingQueue – очередь на хипе DelayQueue – очередь элементов в задержкой SynchronousQueue – очередь без "внутренности" Georgiy Korneev Java Advanced / Collections Framework 9 Многопоточные отображения Представляются интерфейсом ConcurrentMap<K, V> Дополнительные методы putIfAbsent(K, V) – добавляет отображение K, если его ранее не было remove(K, V) – удаляет K, если он отображен на V replace(K, V) – заменяет отображение K replace(K, oldV, newV) – условная замена отображения для ключа K Georgiy Korneev Java Advanced / Collections Framework 10 Другие многопоточные коллекции Коллекции с многопоточным доступом ConcurrentHashMap – отображение ConcurrentLinkedQueue – очередь на списке Коллекции, “самокопирующиеся” при записи CopyOnWriteArrayList – список на массиве CopyOnWriteArraySet – множество на массиве Georgiy Korneev Java Advanced / Collections Framework 11 Часть 2 Атомарные операции Атомарные операции Общие операции get() – атомарное чтение set(value) – атомарная запись compareAndSet(expected, value) – сравнение и запись weakCompareAndSet(expected, value) – слабое сравнение и запись Операции над числами addAndGet() / getAndAdd() addAndIncrement() / incrementAndAdd() addAndDecrement() / decrementAndAdd() Georgiy Korneev Java Advanced / Collections Framework 13 Атомарные переменные Типы AtomicBoolean AtomicInteger AtomicLong AtomicReference Операции Обычные Georgiy Korneev Java Advanced / Collections Framework 14 Атомарные массивы Типы AtomicIntegerArray AtomicLongArray AtomicReferenceArray Операции Обычные, с указанием индекса Georgiy Korneev Java Advanced / Collections Framework 15 Атомарный доступ к полям Типы AtomicIntegerFieldUpdater AtomicLongFieldUpdater AtomicReferenceFieldUpdater Операции Обычные, с указанием объекта Создание newUpdater(class, fieldName) Georgiy Korneev Java Advanced / Collections Framework 16 Помеченные ссылки Типы AtomicMarkableReference – ссылка помеченная флажком AtomicStampedReference – ссылка помеченная числом Georgiy Korneev Java Advanced / Collections Framework 17 Операции с помеченными ссылками Чтения Установки getReference() – прочитать ссылку getX() – прочитать пометку V get(X[] holder) – прочитать ссылку и пометку set(valueV, valueX) – установить пометку и значение. attemptX(oldX, newX) – изменить пометку Условной установки compareAndSet(oldV, newV, oldX, newX) Georgiy Korneev Java Advanced / Collections Framework 18 Часть 3 Примитивы синхронизации Примитивы синхронизации Semaphore – семафор CyclicBarrier – многоразовый барьер CountDownLatch – защелка Exchanger – рандеву Georgiy Korneev Java Advanced / Collections Framework 20 Семафоры Семафор имеет емкость, указываемую при создании Методы acquire(n?) – получить разрешение release(n?) – отдать разрешение tryAquire(n?, time?) – попробовать получить разрешение reducePermits(n) – уменьшить количество разрешений drainPermits() – забрать все разрешения статистика Georgiy Korneev Java Advanced / Collections Framework 21 Барьеры Количество потоков и действие на барьере указывается при создании Методы await(time?) – барьер. reset() – возвращает барьер в исходное состояние isBroken() – “сломан” ли барьер статистика Georgiy Korneev Java Advanced / Collections Framework 22 Защелки Высота защелки указывается при создании Методы await(time?) – ждет спуска защелки. countDown() – опускает защелку на единицу. getCount() – текущая высота защелки. Georgiy Korneev Java Advanced / Collections Framework 23 Рандеву Позволяет потокам синхронно обмениваться объектами Методы exchange(V x, time?) – обменяться Georgiy Korneev Java Advanced / Collections Framework 24 Часть 4 Блокировки Блокировки Интерфейс Lock Методы lock() – захватить блокировку lockInterruptibly() – захватить блокировку tryLock(time?) – попытаться захватить блокировку unlock() – отпустить блокировку newCondition() – создать условие Georgiy Korneev Java Advanced / Collections Framework 26 Условия Интерфейс Condition await(time)? – ждать условия awaitUntil(deadline) – ждать условия до времени awaitUninterruptibly() – ждать условие signal() – подать сигнал signalAll() – подать сигнал всем Georgiy Korneev Java Advanced / Collections Framework 27 Реализация блокировки Класс ReentrantLock Дополнительные методы isFair() – “честность” блокировки isLocked() – блокировка занята getQueuedThreads() / getQueueLength() / hasQueuedThread(thread) / hasQueuedThreads() – потоки, ждущие блокировку getWaitingThreads(condition) / getWaitQueueLength(condition) – потоки, ждущие условие Georgiy Korneev Java Advanced / Collections Framework 28 Читатели и писатели Интерфейс ReadWriteLock Методы readLock() – блокировка для читателей writeLock() – блокировка для писателей Реализация ReentrantReadWriteLock Georgiy Korneev Java Advanced / Collections Framework 29 Часть 5 Управление заданиями Исполнители Интерфейс Executor execute(Runnable) – выполнить задание Интерфейс ExecutorService submit(Runnable) – выполнить задание Future<V> submit(Callable<V>) – выполнить функцию invokeAll(List<Callable>) – выполнить все функции invokeAny(List<Callable>) – успешно выполнить функцию Georgiy Korneev Java Advanced / Collections Framework 31 Функции и результаты Интерфейс Callable<V> – функция V call() – подсчитать функцию Интерфейс Future<V> – результат get(timeout?) – получить результат isDone() – окончено ли выполнение cancel() – прервать выполнение isCancelled() – прервано ли выполнение Georgiy Korneev Java Advanced / Collections Framework 32 Реализация исполнителей Класс ThreadPoolExecutor corePoolSize – минимальное количество потоков maxPoolSize максимальное количество потоков blockingQueue – очередь заданий keepAliveTime – время жизни потока threadFactory – фабрика потоков … Georgiy Korneev Java Advanced / Collections Framework 33 Отложенное исполнение Интерфейс ScheduledExecutorService schedule(callable, timeout) – исполнить через timeout schedule(runnable, timeout?) – исполнить через timeout sheduleAtFixedRate(runnable, initialDelay, period, unit) – периодическое исполнение scheduleWithFixedDelay(runnable, initialDelay, delay, unit) – исполнение с равными интервалами Все методы возвращают ScheduledFuture Georgiy Korneev Java Advanced / Collections Framework 34 Реализация отложенного исполнения Класс ScheduledThreadPoolExecutor Georgiy Korneev Java Advanced / Collections Framework 35 Класс Executors Создание привилегированных Callable Создание фабрик потоков Создание фабрик привилегированных потоков Создание исполнителей с заданным числом потоков Создание исполнителей с неограниченным числом потоков Georgiy Korneev Java Advanced / Collections Framework 36 Часть 6 Дополнительные возможности Интервалы времени Перечисление TimeUnit SECONDS MILLISECONDS MICROSECONDS NANOSECONDS Интервалы задаются парой Значение Единица измерения Georgiy Korneev Java Advanced / Collections Framework 38 Очереди с задержкой Класс DelayQueue Интерфейс Delayed getDelay(unit) – получить остаток задержки Georgiy Korneev Java Advanced / Collections Framework 39 Часть 7 Заключение Ссылки JSR 166: Concurrency Utilities // http://jcp.org/en/jsr/detail?id=166 Concurrent Programming with J2SE 5.0 // http://java.sun.com/developer/technicalArticle s/J2SE/concurrency/ Getting to know synchronizers http://java.sun.com/developer/JDCTechTips/2 005/tt0216.html#1 Georgiy Korneev Java Advanced / Collections Framework 41 Вопросы Georgiy Korneev Java Advanced / Collections Framework 42