Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Обзор возможностей многопоточности в Java [JUG.RU]

Обзор возможностей многопоточности в Java [JUG.RU]

Встретить однопоточную программу в наше время — редкость (если не смотреть на JavaScript). В этом докладе мы разберём возможности организации многопоточного кода в Java: от конструирования велосипедов и запуска потоков ручками до ForkJoinPool-ов, зеленых потоков и транзакционной памяти.
Писать корректный многопоточный код сложно, и выбор правильной модели может существенно облегчить последующие страдания программистов. Но какой подход лучше всего?

В этом докладе мы разберем простую задачку на параллельное выполнение кода и решим ее разными способами: потоками, сгруппированными потоками, актёрами, зелеными потоками, с помощью CompletableFuture и так далее. Каждый новый способ отличается по простоте написания и поддержки кода, легче масштабируется на более сложные задачи. В итоге мы выясним, что и когда лучше использовать.

Oleg Šelajev

August 30, 2017
Tweet

More Decks by Oleg Šelajev

Other Decks in Programming

Transcript

  1. Обзор возможностей
    многопоточности в Java

    View Slide

  2. @shelajev

    View Slide

  3. View Slide

  4. Safe harbour and
    stuff
    Внимание!!

    View Slide

  5. ЗАЧЕМ ОНО НАМ?

    View Slide

  6. А ВСЕ ТАКИ?
    https://twitter.com/reubenbond/status/662061791497744384

    View Slide

  7. View Slide

  8. CONCURRENCY | PARALLELISM
    http://joearms.github.io/2013/04/05/concurrent-and-parallel-programming.html

    View Slide

  9. В ТЕОРИИ

    View Slide

  10. НА ПРАКТИКЕ

    View Slide

  11. View Slide

  12. THREADS
    ORGANIZED THREADS
    FORK-JOIN FRAMEWORK
    COMPLETABLE FUTURES ACTORS FIBERS
    SOFTWARE TRANSACTIONAL MEMORY

    View Slide

  13. View Slide

  14. КТО ВО ЧТО ГОРАЗД?
    http://zeroturnaround.com/rebellabs/flavors-of-concurrency-in-java-threads-executors-forkjoin-and-actors/

    View Slide

  15. View Slide

  16. ПОТОКИ
    Поток это сущность
    способная выполнять
    инструкции программы и
    регулируемая “шедулером".

    View Slide

  17. View Slide

  18. ЗАЧЕМ ПОТОКИ
    Моделируют железо
    Моделируют операционку
    User-space концепция

    View Slide

  19. КАК ПОТОКИ ОБЩАЮТСЯ
    Объекты и поля
    Atomic*
    Очереди
    База данных

    View Slide

  20. КТО РУЛИТ ОБЩЕНИЕМ?
    The Java Language
    Specification
    17.4. Memory Model

    View Slide

  21. ЗАДАЧА

    View Slide

  22. ВЫВОДЫ: ПОТОКИ
    Тратят ресурсы
    Ручное управление
    Быстро и легко
    Не очень просто

    View Slide

  23. View Slide

  24. ГРУППЫ ПОТОКОВ
    “thread pool“ это когда
    существует m потоков, что бы
    выполнить n задач.

    View Slide

  25. View Slide

  26. ПОДВОДНЫЕ КАМНИ: EXECUTORS
    Размер очереди
    Стратегия переполнения
    Стратегия отмены

    View Slide

  27. ВЫВОДЫ: EXECUTORS
    Простота настройки
    Ограниченный overhead
    Заметает сложные вопросы под
    коврик

    View Slide

  28. http://i.ytimg.com/vi/6_W_xLWtNa0/maxresdefault.jpg

    View Slide

  29. FORK JOIN
    Рекурсивные задачи
    Общие задачи параллелизации
    Work stealing

    View Slide

  30. http://www.javaspecialists.eu/archive/Issue223.html
    Blocking methods should not be called from
    within parallel streams in Java 8, otherwise
    the shared threads in the common
    ForkJoinPool will become inactive. In this
    newsletter we look at a technique to
    maintain a certain liveliness in the pool, even
    when some threads are blocked.
    MANAGED BLOCKER
    от Dr. Heinz M. Kabutz

    View Slide

  31. TAKEAWAY: FORK JOIN POOL
    Эффективный
    Настроеный умными людьми
    Простота использования
    Есть подводные камни

    View Slide

  32. View Slide

  33. Победа типов над многопоточностью
    java.util.concurrent.CompletableFuture
    thenApply(Function / Consumer / etc)
    thenApplyAsync(Function / etc)

    View Slide

  34. Completable Future
    https://vimeo.com/131394616

    View Slide

  35. View Slide

  36. ACTORS
    "Actors" универсальный
    примитив многопоточных
    вычислений.

    View Slide

  37. ЧТО МОЖЕТ АКТОР?
    Реагировать на сообщения
    Породить конечное число акторов
    Ответить заказчику

    View Slide

  38. View Slide

  39. ТИПИЗИРОВАННЫЕ АКТОРЫ
    public static interface Squarer {
    //fire-forget
    void squareDontCare(int i);
    //non-blocking send-request-reply
    Future square(int i);
    //blocking send-request-reply
    Option squareNowPlease(int i);
    //blocking send-request-reply
    int squareNow(int i);
    }

    View Slide

  40. ВЫВОДЫ: ACTORS
    ООП это про сообщения
    Multiplexing like a boss
    Supervision & Fault tolerance

    View Slide

  41. http://static1.squarespace.com/static/50aa813ce4b0726ad3f3fdb0/51e1e393e4b0180cf3bcbb46/51e1e39ae4b0fa94cee721f9/1373758363472/forest-by-marshmallow-laser-feast-the-tree-mag-30.jpg

    View Slide

  42. FIBERS
    Легковесные (зеленые)
    потоки которые
    контролируются отдельным
    “шедулером”.

    View Slide

  43. View Slide

  44. QUASAR FIBERS
    @Suspendable
    public void myMethod(Input x) {
    x.f();
    }

    View Slide

  45. QUASAR FIBERS
    new Fiber() {
    @Override
    protected V run()
    throws SuspendExecution, InterruptedException {
    // your code
    }
    }.start();

    View Slide

  46. FIBERS
    Quasar “freezes” the fiber’s stack
    into a continuation task that
    can be re-schedule later on.

    View Slide

  47. ВЫВОДЫ: FIBERS
    Continuations
    Прогресс по всему фронту работ
    Модификация байткода программы
    Высокая скалируемость

    View Slide

  48. View Slide

  49. ТРАНЗАКЦИОННАЯ ПАМЯТЬ

    View Slide

  50. STM
    import akka.stm.*;
    final Ref ref = new Ref(0);
    new Atomic() {
    public Object atomically() {
    return ref.set(5);
    }
    }.execute();

    View Slide

  51. STM
    final TransactionalMap users = new
    TransactionalMap();
    // fill users map (in a transaction)
    new Atomic() {
    public Object atomically() {
    users.put("bill", new User("bill"));
    users.put("mary", new User("mary"));
    users.put("john", new User("john"));
    return null;
    }
    }.execute();

    View Slide

  52. ВЫВОДЫ: TX MEMORY
    Retry / Fail
    ACID

    View Slide

  53. THREADS
    ORGANIZED THREADS
    FORK-JOIN FRAMEWORK
    COMPLETABLE FUTURES ACTORS FIBERS
    SOFTWARE TRANSACTIONAL MEMORY

    View Slide

  54. ЧТО МЫ ИМЕЕМ?

    View Slide

  55. View Slide

  56. https://twitter.com/CodeWisdom/status/834125287151501312

    View Slide

  57. Seven Concurrency
    Models in Seven
    Weeks:
    When Threads Unravel
    by Paul Butcher
    https://pragprog.com/book/pb7con/seven-concurrency-models-in-seven-weeks

    View Slide

  58. http://www.amazon.com/The-Multiprocessor-Programming-Revised-Reprint/dp/0123973376
    The Art of
    Multiprocessor
    Programming
    by Maurice Herlihy, Nir Shavit

    View Slide

  59. [email protected]
    @shelajev
    Давайте дружить!

    View Slide