Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Talk juc jeeconf

1,277 views

Published on

  • Be the first to comment

  • Be the first to like this

Talk juc jeeconf

  1. 1. Что нового в j.u.c(JSR 166e)Дмитрий Чуйкоdmitry.chuyko@oracle.com
  2. 2. OutlineВведениеЧто новогоAtomicsLocksAccumulatorsCollectionsSlide 2/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  3. 3. The following is intended to outline our generalproduct direction. It is intended for informationpurposes only, and may not be incorporated into anycontract. It is not a commitment to deliver anymaterial, code, or functionality, and should not berelied upon in making purchasing decisions. Thedevelopment, release, and timing of any features orfunctionality described for Oracle’s products remainsat the sole discretion of Oracle.Slide 3/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  4. 4. ВведениеSlide 4/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  5. 5. Введение: СитуацияВсем нужны масштабируемость, надёжность,производительностьThe Free Lunch Is Over, Herb Sutter, 2005Многопоточность может возникать из-заусловий задачиМногопроцессорность/многоядерность вездеSlide 5/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  6. 6. История: ЦелиПараллелизация за кулисамиЗагрузка процессора полезной работойХорошие алгоритмыSlide 6/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  7. 7. История: 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  Deques,JSRs  JSR 166x2011JDK 7  ForkJoinPool,JSRs  JSR 166yJDK 8  java.util.concurrentJSRs  JSR 166eSlide 7/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  8. 8. История: СоставJava Concurrency UtilitiesExecutorsSynchronizers CollectionsAtomics Locks Nano timeSlide 8/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  9. 9. История: ФундаментRuntimeLockSupportUnsafeJVMIntrinsicsOSpthreads mutexHardwareCASSlide 9/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  10. 10. История: Атомарные переменные@since 1.5Обёртки примитивов, ссылок, управлениеполями– Compare-And-Set– Атомарная арифметикаSlide 10/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  11. 11. История: Синхронизация@since 1.5Semaphores, mutexes, barriers, latches,exchangers– Удобство синхронизацииLocks– Производительность– Модель памяти. Эффект эквивалентенsynchronized– ГибкостьSlide 11/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  12. 12. История: Concurrent Collections@since 1.5ArrayBlockingQueue, PriorityBlockingQueue,LinkedBlockingQueue, SynchronousQueue,DelayQueueConcurrentHashMapCopyOnWriteArrayListCopyOnWriteArraySetSlide 12/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  13. 13. История: Concurrent Collections@since 1.6, @since 1.7LinkedBlockingDeque, LinkedTransferQueueConcurrentSkipListMapConcurrentSkipListSetSlide 13/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  14. 14. История: Task Scheduling@since 1.5, @since 1.7Executor’ы– Выполнение асинхронных задач– Политики выполненияSlide 14/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  15. 15. Что новогоSlide 15/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  16. 16. Что нового: JC UtilitiesExecutorsForkJoinPool (updated, CountedCompleter)Collections AccumulatorsConcurrentHashMap (v8) LongAccumulator DoubleAccumulatorLongAdder DoubleAdderLongAdderTableLocks Atomics SynchronizersStampedLock AtomicDoubleArray CompletableFutureAtomicDoubleSlide 16/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  17. 17. AtomicsSlide 17/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  18. 18. Atomics: Чего не хватаетДля каких примитивных типов нетAtomic-типов?В каких числах чаще всего считаем?Возникают массивы атомарных данныхSlide 18/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  19. 19. Atomics: AtomicDouble@since 1.8Брат-близнец AtomicLongNumber, SerializablecompareAndSet(double expect, double update)addAndGet(double delta)Равенство битов значений– doubleToRawLongBits()Slide 19/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  20. 20. Atomics: AtomicDoubleArray@since 1.8Брат-близнец AtomicLongArraySerializablecompareAndSet(int i, double exp, double upd)addAndGet(int i, double delta)Равенство битов значений– doubleToRawLongBits()Slide 20/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  21. 21. Atomics: PerformanceПриводимые результаты– Intel R○ Xeon R○ E5-2680 (2x8x2, 2.7 GHz)– Linux x64 (RHEL 5.5, kernel 2.6.32)– JDK 7 (1.7.0_11)– OpenJDK JMH 1.0Slide 21/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  22. 22. Atomics: AtomicDoubleArrayТест производительности– Размер массива 2, 621, 440– Читатели делают get()– Писатели делают compareAndSet()– Произвольный равномерный доступSlide 22/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  23. 23. Atomics: AtomicDoubleArray020040025 50 75% of writersReadthroughput,ops/usecBenchmarkAtomicDouble[]AtomicDoubleArrayT=32010020030025 50 75 100% of writersWritethroughput,ops/usecBenchmarkAtomicDouble[]AtomicDoubleArrayT=32Slide 23/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  24. 24. LocksSlide 24/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  25. 25. Locks: Чего бы хотелосьБлокировка на чтение, на записьЧтение без блокировкиUpgrade/downgrade (RL↔WL)Простота использованияИ чтобы быстро работалоSlide 25/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  26. 26. Locks: ReentrantReadWriteLock@since 1.5Lock, блокировка на чтение, на записьПовторная входимость (reentrancy)Пробная блокировка, таймауты,прерываемостьSlide 26/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  27. 27. Locks: ReentrantReadWriteLock@since 1.5Lock, блокировка на чтение, на записьПовторная входимость (reentrancy)Пробная блокировка, таймауты,прерываемостьConditionsFair/unfairSerializable. . .Memory effectsSlide 26/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  28. 28. Locks: ReentrantReadWriteLockreadLock() на чтение, writeLock() назаписьПопробуйте написать оптимистичное чтение,гарантировать memory effectsDowngrade WL→RL: захват RL под WLВнутри работает с ThreadLocalSlide 27/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  29. 29. Locks: StampedLock@since 1.8Пример из javadocSlide 28/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  30. 30. Locks: StampedLockPointclass Point {private double x, y;private final StampedLock sl = new StampedLock ();...Slide 29/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  31. 31. Locks: StampedLockOptimistic Readdouble distanceFromOrigin () { // A read -only methodlong stamp = sl. tryOptimisticRead ();double currentX = x;double 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 30/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  32. 32. Locks: StampedLockUpgradevoid moveIfAtOrigin (double newX , double newY) { // upgradelong stamp = sl.readLock (); // Could start with optimistictry {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 31/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  33. 33. Locks: StampedLockОптимистичное чтениеЕсли проверки неудачные, можно захватитьблокировку– Обычно удачныеSlide 32/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  34. 34. Locks: StampedLockОптимистичное чтениеЕсли проверки неудачные, можно захватитьблокировку– Обычно удачныеВыигрыш– Мало записей ⇒ в разы– Нет записей ⇒ на порядки– Вне блокировки проверенное состояние можетстать неактуальнымSlide 32/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  35. 35. Locks: StampedLockПовышение уровня блокировки– Может не быть выигрыша, если неограничивать запись– Валидное состояниеSlide 33/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  36. 36. Locks: StampedLockПовышение уровня блокировки– Может не быть выигрыша, если неограничивать запись– Валидное состояниеВ штатном варианте может быть в разыбыстрее RRWL– Не гарантировано!– При этом потребляет меньше ресурсов– Можно передавать меткуSlide 33/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  37. 37. AccumulatorsSlide 34/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  38. 38. Accumulators: ЗадачаИнкрементируем счётчик в разных нитяхНити подбирают работу и имеют доступ кобщему контекстуvoid call () { // N threads...invocations.increment ();}...long getCount () {return invocations .get ();}Что использовать для invocations?Slide 35/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  39. 39. Accumulators: Простое решениеAtomicLong invocations = new AtomicLong (0L); // context...void call () { // N threads...invocations. getAndIncrement ();}...long getCount () { // cumulative valuereturn invocations .get ();}Slide 36/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  40. 40. Accumulators: AtomicLongSharingSpin loop + CAS, многоSlide 37/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  41. 41. Accumulators: LongAdderЗащита от коллизий за счёт структуры иалгоритма– PaddedAtomicLong[runtime.availableProcessors()]Простой APINumberSlide 38/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  42. 42. Accumulators: РешениеLongAdder invocations = new LongAdder (); // context...void call () { // N threads...invocations.increment ();}...long getCount () { // cumulative valuereturn invocations .sum ();}Slide 39/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  43. 43. Accumulators: DoubleAdderАналогичен LongAdder, только для doubleБольшая часть логики одинаковаяSlide 40/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  44. 44. 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 41/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  45. 45. Accumulators: Произвольныекоммутативные операцииLongAccumulatorLongAccumulator invocations =new LongAccumulator (Long ::sum , 0L); // context...void call () { // N threads...invocations.accumulate (1);}...long getCount () { // cumulative valuereturn invocations .get ();}DoubleAccumulatorSlide 42/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  46. 46. Accumulators: AtomicsAtomicXXX– updateAndGet(current -> current + 1)– getAndAccumulate(delta, (current, delta) -> current+delta)Slide 43/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  47. 47. Accumulators: LongMaxUpdaterLongAccumulator(Long::max, Long.MIN_VALUE)Тест производительности– accumulate(nextLocalLongMax)Slide 44/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  48. 48. Accumulators: LongMaxUpdater1010010000 20 40 60ThreadsThroughput,ops/usec(logscale)Benchmark Unshared CAS LongMaxUpdater AtomicLong long+LockSlide 45/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  49. 49. Accumulators: Подводные камниLocal, ThreadLocal – эффективнее, еслиможно применитьget(), reset() под нагрузкой просаживаютпроизводительность– Обход всех ячеекГраницы эффекта– Система до насыщения– Итерации менее 1 мксSlide 46/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  50. 50. CollectionsSlide 47/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  51. 51. ConcurrentHashMap: CHMv7Lock striping– Concurrency level– Сегмент - ReentrantLockget() без блокировкиЗащита от алгоритмических атак– Другой хэш для StringSlide 48/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  52. 52. ConcurrentHashMap: CHMv8Lock striping– Concurrency level не используется, подстройкаструктуры в процессе работы– Node (bucket): synchronized или StampedLockSlide 49/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  53. 53. ConcurrentHashMap: CHMv8Lock striping– Concurrency level не используется, подстройкаструктуры в процессе работы– Node (bucket): synchronized или StampedLockget() без блокировки или под блокировкойна чтениеSlide 49/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  54. 54. ConcurrentHashMap: CHMv8Lock striping– Concurrency level не используется, подстройкаструктуры в процессе работы– Node (bucket): synchronized или StampedLockget() без блокировки или под блокировкойна чтениеЗащита от алгоритмических атак– Сбалансированное дерево для Comparable -performanceSlide 49/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  55. 55. ConcurrentHashMap: v8 vs v7Тест производительности– put()– Integer-like ключи– Нормальное распределение– 2, 621, 440 элементов– concurrencyLevel == 32 (optimal)Slide 50/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  56. 56. ConcurrentHashMap:Масштабируемость1100 20 40 60ThreadsThroughput,ops/usec(logscale)Benchmark CHMv8 CHMv7 HashMap+ReentrantLockSlide 51/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  57. 57. ConcurrentHashMap: Часть JDK 8Часть методов появилась в других мапахчерез default-реализации в Map– putIfAbsent(), computeIfAbsent() атомарны в CHMSlide 52/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  58. 58. ConcurrentHashMap: Часть JDK 8Часть методов появилась в других мапахчерез default-реализации в Map– putIfAbsent(), computeIfAbsent() атомарны в CHMДобавились новые методы и возможности– map.merge(key, valueSuffix, String::concat)– chm.values().parallelStream()Slide 52/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  59. 59. ConcurrentHashMap: Часть JDK 8Часть методов появилась в других мапахчерез default-реализации в Map– putIfAbsent(), computeIfAbsent() атомарны в CHMДобавились новые методы и возможности– map.merge(key, valueSuffix, String::concat)– chm.values().parallelStream()Можно использовать лямбды и methodreference– int2IntMap.computeIfAbsent(100, (k)->k/3)– stream.map(theMap::get)Slide 52/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  60. 60. LongAdderTable: ЗадачаРегистрировать распределение объектов– Моделирование– Профилированиеvoid call () { // N threads...invocations.increment("call");}...long getCount(String name) { // cumulative valuereturn invocations .sum(name );}Slide 53/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  61. 61. LongAdderTable: РешениеЕстественная комбинация– new ConcurrentHashMap<K, LongAdder>()Простой APISerializableSlide 54/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  62. 62. LongAdderTable: APIinstall(K key)increment(K key)add(K key)sum(K key)и другиеSlide 55/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  63. 63. Заключение: КнигиJava Concurrency in PracticeBrian Goetz, Tim Peierls, Joshua Bloch, JosephBowbeer, David Holmes, Doug LeaConcurrent Programming in Java: DesignPrinciples and PatternsDoug LeaSlide 56/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  64. 64. Заключение: Ресурсы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 57/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  65. 65. Низкоуровневые API: МотивацияJMM абстрактна, железо конкретноЕсть полезные трюкиНе используйте низкоуровневые APIнапрямуюSlide 57/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  66. 66. Низкоуровневые API: UnsafeНе часть языка– Обход JMM– sun.miscUnsafe API в Hotspot– Аккуратный– Абстрактный– ДостаточныйНе используйте Unsafe напрямую, это unsafeSlide 57/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  67. 67. Низкоуровневые API: UnsafeНовая механика– storeFence()– loadFence()– fullFence()– Использование в реализации LocksSlide 57/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.
  68. 68. Низкоуровневые API: StampedLockListing 1: Optimistic Read/* volatile long state */...long stamp = sl. tryOptimisticRead (); /* s = state */double currentX = x;double currentY = y;if (!sl.validate(stamp )) { /* unsafe.loadFence () */...stamp = sl.writeLock (); /* CAS(state , next) */x = newX;y = newY;sl.unlock(stamp );Slide 57/57. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

×