What's new in java.util.concurrent
Upcoming SlideShare
Loading in...5
×
 

What's new in java.util.concurrent

on

  • 707 views

 

Statistics

Views

Total Views
707
Views on SlideShare
707
Embed Views
0

Actions

Likes
1
Downloads
11
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    What's new in java.util.concurrent What's new in java.util.concurrent Presentation Transcript

    • Обзор нововведений в j.u.c(JSR 166e)Дмитрий Чуйкоdmitry.chuyko@oracle.com
    • OutlineВведениеЧто новогоАтомарные переменныеLocksAccumulatorsCollectionsSlide 2/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • The following is intended to outline our general product direction. Itis intended for information purposes only, and may not beincorporated into any contract. It is not a commitment to deliver anymaterial, code, or functionality, and should not be relied upon inmaking purchasing decisions. The development, release, and timingof any features or functionality described for Oracle’s productsremains at the sole discretion of Oracle.Slide 3/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • ВведениеSlide 4/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Введение: РесурсыConcurrency JSR-166 Interest Sitehttp://g.oswego.edu/dl/concurrency-interest/JDK 8http://jdk8.java.net/Project Lambdahttp://openjdk.java.net/projects/lambda/JMHhttp://openjdk.java.net/projects/code-tools/jmh/Slide 5/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Введение: Мир, в котором мы живёмВсем нужны масштабируемость, надёжность,производительностьThe Free Lunch Is Over Herb SutterМногопоточность может возникать из-за условий задачиМногопроцессорность/многоядерность вездеSlide 6/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • История: ЦелиПараллелизация за кулисамиЗагрузка процессора полезной работойХорошие алгоритмыSlide 7/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • История: Java Concurrency TimelineJDK 1.0  JMM  synchronizied  Thread1996 1997 2004JDK 1.2  CollectionsJDK 5  JMM  java.util.concurrentJSRs  JSR 133  JSR 166Doug Lea Concurrencypackage1998 2006JDK 6  NavigableJSRs  JSR 166x2011JDK 7  FJP,JSRs  JSR 166yJDK 8  java.util.concurrentJSRs  JSR 166eSlide 8/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • История: Алгоритмы с координациейБлокирующиеся (blocking)Неблокирующиеся (nonblocking) При остановке однойнити у других есть шанс закончить работуБез препятствий (obstruction-free) Любая нить в изоляцииможет закончить работуСвободные от блокировок (lock-free) На каждом шагепродвигается какая-либо из нитейБез ожиданий (wait-free) Каждая нить продвигаетсяАлгоритмы, основанные на CAS, могут быть nonblockinglock-freeSlide 9/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • История: СоставJava Concurrency UtilitiesExecutorsSynchronizers CollectionsAtomics Locks Nano timeSlide 10/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • История: Атомарные переменныеОбёртки примитивов, ссылок, управление полямиCompare-And-SetАтомарная арифметикаSlide 11/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • История: СинхронизацияSemaphores, mutexes, barriers, latches, exchangersУдобство синхронизацииLocksПроизводительностьМодель памяти. Эффект эквивалентен synchronizedГибкостьSlide 12/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • История: Concurrent Collections(Blocking)(De)Queue, Map, ListПараллельный доступВысокая производительностьSlide 13/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • История: Task Scheduling FrameworkExecutor’ыВыполнение асинхронных задачПолитики выполненияSlide 14/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Что новогоSlide 15/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Что нового: Тот же фундаментRuntimeLockSupportUnsafeJVMIntrinsicsOSpthreads mutexHardwareCASSlide 16/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Что нового: JC UtilitiesExecutorsCompletableFuture CountedCompleter ForkJoinPoolCollections Accumulators CombinedConcurrentHashMap LongAccumulator LongAdderTableDoubleAccumulatorLongAdderDoubleAdderLocks AtomicsStampedLock AtomicDoubleArrayAtomicDoubleSlide 17/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Низкоуровневые API: МотивацияJMM абстрактна, железо конкретноЕсть полезные трюкиНе используйте низкоуровневые API напрямуюSlide 18/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Низкоуровневые API: UnsafeНе часть языкаОбход JMMsun.miscUnsafe API в HotspotАккуратныйАбстрактныйДостаточныйНе используйте Unsafe напрямую, это unsafeSlide 19/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Низкоуровневые API: UnsafeНовая механикаstoreFence()loadFence()fullFence()Использование в реализации LocksSlide 20/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Атомарные переменныеSlide 21/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Атомарные переменные: Чего не хватаетДля каких примитивных типов нет Atomic-типов?В каких числах чаще всего считаем?Возникают массивы атомарных данныхSlide 22/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Атомарные переменные: AtomicDoubleБрат-близнец AtomicLongNumber, SerializablecompareAndSet(double expect, double update)addAndGet(double delta)Равенство битов значенийdoubleToRawLongBits()Slide 23/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Атомарные переменные: AtomicDoubleArrayБрат-близнец AtomicLongArraySerializablecompareAndSet(int i, double expect, double update)addAndGet(int i, double delta)Равенство битов значенийdoubleToRawLongBits()Slide 24/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Атомарные переменные: PerformanceПриводимые результатыIntel R○ Xeon R○ E5-2680 (2x8x2)LinuxJDK 7OpenJDK JMH 1.0Slide 25/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Атомарные переменные: AtomicDoubleArrayТест производительностиНе слишком маленький массивЧитатели делают get()Писатели делают compareAndSet()Произвольный равномерный доступSlide 26/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Атомарные переменные: AtomicDoubleArray020040025 50 75% of writersReadthroughput,ops/usecBenchmarkAtomicDouble[]AtomicDoubleArrayT=32010020030025 50 75 100% of writersWritethroughput,ops/usecBenchmarkAtomicDouble[]AtomicDoubleArrayT=32Slide 27/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • LocksSlide 28/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Locks: ReentrantReadWriteLockLock, блокировка на чтение, на записьПовторная входимость (reentrancy)Пробная блокировка, таймауты, прерываемостьConditionsFair/unfairSerializable. . .Memory effectsSlide 29/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Locks: Чего бы хотелосьБлокировка на чтение, на записьОптимистичные блокировкиUpgrade/downgradeПростота использованияИ чтобы быстро работалоSlide 30/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Locks: ReentrantReadWriteLockreadLock() на чтение, writeLock() на записьПопробуйте написать оптимистичную блокировку,гарантировать memory effectsDowngrade: захват RL под WLПостоянно работает с ThreadLocalSlide 31/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Locks: StampedLockПример из javadocSlide 32/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Locks: StampedLockListing 1: Pointclass Point {private double x, y;private final StampedLock sl = new StampedLock ();...Slide 33/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Locks: StampedLockListing 2: Optimistic Readdouble distanceFromOrigin () { // A read -only methodlong stamp = sl. tryOptimisticRead ();double currentX = x, currentY = y;if (!sl.validate(stamp )) {stamp = sl.readLock ();try {currentX = x;currentY = y;} finally {sl.unlockRead(stamp );}}return Math.sqrt(currentX * currentX + currentY * currentY );}Slide 34/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Locks: StampedLock. Upgradevoid moveIfAtOrigin (double newX , double newY) { // upgrade// Could instead start with optimistic , not read modelong stamp = sl.readLock ();try {while (x == 0.0 && y == 0.0) {long ws = sl. tryConvertToWriteLock (stamp );if (ws != 0L) {stamp = ws;x = newX;y = newY;break;}else {sl.unlockRead(stamp );stamp = sl.writeLock ();}}} finally {sl.unlock(stamp );}}Slide 35/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Locks: StampedLockОптимистичные блокировкиЕсли проверки неудачные, можно захватить блокировкуОбычно удачныеВыигрышМало записей => в разыНет записей => на порядкиВне блокировки, проверенное состояние может статьнеактуальнымSlide 36/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Locks: StampedLockПовышение уровня блокировкиМожет не быть выигрыша, если не ограничивать записьВалидное состояниеВ обычном варианте может быть в разы быстрее RRWLНе гарантировано!При этом потребляет меньше ресурсовМожно передавать меткуSlide 37/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • AccumulatorsSlide 38/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Accumulators: ЗадачаИнкрементируем счётчик в разных нитяхНити подбирают работу и имеют доступ к общему контекстуSlide 39/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Accumulators: Простое решениеAtomicLong atomicLong = new AtomicLong (0L); // context...atomicLong. getAndIncrement (); // N threads...long sharedSum = atomicLong.get ();Slide 40/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Accumulators: AtomicLongSharingSpin loop + CAS, многоSlide 41/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Accumulators: LongAdderЗащита от коллизий за счёт структуры и алгоритмаПохож на комбинацию unshared padded AtomicLong’овПростой APINumberSlide 42/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Accumulators: РешениеLongAdder longAdder = new LongAdder (); // context...longAdder.increment (); // N threads...long sharedSum = longAdder.sum ();Slide 43/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Accumulators: DoubleAdderАналогичен LongAdder, только для doubleБольшая часть логики одинаковая, базовый класс Striped64Slide 44/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Accumulators: Atomic Update// AtomicLong , JDK 7public final long addAndGet(long delta) {for (;;) {long current = get ();long next = current + delta;if ( compareAndSet (current , next ))return next;}}Slide 45/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Accumulators: Произвольные коммутативныеоперацииЗаменяем ’+’ функциейStriped64, NumberLongAccumulator аналогичен LongAddernew LongAccumulator(Long::sum, 0L)DoubleAccumulator аналогичен DoubleAddernew DoubleAccumulator(Double::sum, 0.0D)Slide 46/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Accumulators: LongMaxUpdaternew LongAccumulator(Long::max, Long.MIN_VALUE)Тест производительностиaccumulate(nextLocalLongMax)Slide 47/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Accumulators: LongMaxUpdater1010010000 20 40 60ThreadsThroughput,ops/usec(logscale)Benchmark Unshared CAS LongMaxUpdater AtomicLong long+LockSlide 48/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Accumulators: Подводные камниLocal, ThreadLocal – эффективнее, если можно применитьget(), reset() под нагрузкой просаживаютпроизводительностьОбход всех ячеекГраницы эффектаСистема до насыщенияИтерации менее 1 мксSlide 49/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • CollectionsSlide 50/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • ConcurrentHashMap: CHMv7Lock stripingConcurrency levelСегмент - ReentrantLockget() без блокировкиЗащита от DoSДругой хэш для StringSlide 51/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • ConcurrentHashMap: CHMv8Lock stripingConcurrency level не используется, подстройка в процессе работыNode: synchronized или AbstractQueuedSynchronizerget() без блокировки или под блокировкой на чтениеЗащита от DoSСбалансированное дерево для Comparable - performanceSlide 52/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • ConcurrentHashMap: CHMv8 vs CHMv7Тест производительностиInteger-like ключиconcurrencyLevel == 32Размер порядка L3Нормальное распределениеput()Slide 53/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • ConcurrentHashMap: Масштабируемость1100 20 40 60ThreadsThroughput,ops/usec(logscale)Benchmark CHMv8 CHMv7 HashMap+ReentrantLockSlide 54/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • ConcurrentHashMap: Часть JDK 8Часть методов появилась в других мапах черезdefault-реализации в MapputIfAbsent(), computeIfAbsent() атомарны в CHMДобавились новые методы и возможностиmap.merge(key, valueSuffix, String::concat)chm.values().parallelStream()Можно использовать лямбды и method referenceint2IntMap.computeIfAbsent(100, (k)->k/3)theMap::get можно использовать для... map()Slide 55/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • LongAdderTable: ЗадачаРегистрировать распределение объектовМоделированиеПрофилированиеSlide 56/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • LongAdderTable: РешениеЕстественное использование LongAdderConcurrentHashMap<K, LongAdder>SerializableSlide 57/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • LongAdderTable: APIinstall(K key)increment(K key)add(K key)sum(K key)и другиеSlide 58/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Заключение: КнигиJava Concurrency in PracticeBrian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, DavidHolmes, Doug LeaConcurrent Programming in Java: Design Principles andPatternsDoug LeaSlide 59/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
    • Заключение: РесурсыConcurrency JSR-166 Interest Sitehttp://g.oswego.edu/dl/concurrency-interest/JDK 8http://jdk8.java.net/Project Lambdahttp://openjdk.java.net/projects/lambda/JMHhttp://openjdk.java.net/projects/code-tools/jmh/Slide 60/60. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.