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