10 советов по многопоточному программированию на Java


Оглавление (нажмите, чтобы открыть):

Must read: 10 книг по Java

Подборка основана на советах разработчиков Google, Microsoft, Luxoft и Amazon.com и их личном опыте в изучении Java. Некоторые книги доступны только в оригинале, что служит веским аргументом учить технический английский. Мы пишем об этом в статье «10 советов, как быстро выучить технический английский».

Head First Java, 2nd Edition (Изучаем Java)
Kathy Sierra (Кэти Сьера)

Книга для новичков. Оптимально подойдет для быстрого старта в изучении Java. Вместе с чтением этой книги рекомендуем записаться на наш бесплатный курс по основам Java-программирования.

Introduction to Programming in Java: An Interdisciplinary Approach
Robert Sedgewick

Книга не просто учит Java, она учит использовать данный язык, как инструмент. В ней вы найдете массу полезных упражнений. Помимо этого есть сайт с дополнительной информацией, полностью посвященный этой книге — Introduction to Programming in Java.

Core java (Java. Библиотека профессионала, том 1-2)
Cay S. Horstmann (Кей С. Хорстманн)

Это одна из самых всеобъемлющих книг по Java. В ней описаны все необходимые средства языка и библиотеки. Здесь только факты и углубленные исследования, которые помогут в написании реальных программ.

Thinking in Java (Философия Java)
Bruce Eckel (Брюс Эккель)

Эта книга заслужено является частым ответом на вопрос: «с чего начинать учить Java?». Но если вы только начинаете изучать язык и при этом не имеете программистского бэкграунда, то можете ее не осилить. В таком случае лучше начать с чего-то более простого и традиционного.

Effective Java: Programming Language Guide (Java. Эффективное программирование)
Joshua Bloch (Джошуа Блох)

Джеймс Гослинг, автор языка Java, когда эта книга вышла, сказал: «Некоторые, возможно, думают, что мне не нужны никакие книги по Java, но эта мне нужна.» Здесь вы найдете более 50-ти лучших практик и советы по усовершенствованию кода от выдающегося эксперта в даной области.

Clean code (Чистый код)
Robert Martin (Роберт Мартин)

Книга о том, как писать код так, чтобы его понимали. Она научит отличать плохой код от хорошего и трансформировать плохой код в хороший. Но стоит помнить о том, что некоторые мысли там выражаются слишком категорично и поэтому могут быть неправильно восприняты новичками.

Clean coder
Robert Martin

Это более гуманитарная книга об отношении к работе. Она затрагивает тему коммуникации и дает общий обзор того, что значит быть профессиональным программистом.

Java Concurrency in Practice
Brian Goetz

Если вы имеете серьезные намерения насчет разработки на Java, то нельзя игнорировать параллелизм и многопоточность. Книга вооружит вас концепциями и техниками, необходимыми для написания безопасных и масштабируемых программ под новейшие платформы.

Java Puzzlers
Joshua Bloch and Neal Gafter

Книга написана в соавторстве главного инженера с Java-евангелистом Google. Она состоит из 95-ти обучающих головоломок, которые будет понятны всем, кто имеет навыки работы с Java, но даже для самых опытных ветеранов эти задачки покажутся сложными.

SCJP Sun Certified Programmer for Java 6 Exam 310-065 (Книга для подготовки к экзамену на сертификат Java программиста)

Учебное пособие для подготовке к сдаче SCJP экзамена.

Algorithms in Java (Алгоритмы на Java)
Robert Sedgewick (Роберт Седжвик)

Книга для того, чтобы попрактиковаться на задачках, набить руку в программировании и прокачать мозг.

Однако одного чтения книг недостаточно. «Главное побыстрее выучить основы и искать работу стажера или Juniora, а там уже знания будут накапливаться по экспоненте, если человек не ленивый, конечно. Я начал программировать, когда действительно клюнул петух в одно место — поставили уже на работе конкретную задачу и дали сроки. На работу попал Junior’ом по устному собеседованию, считаю что повезло и мне сделали большое одолжение» — говорит Дмитрий Фатеев, Senior Java Developer в Luxoft Russia.

А в полной мере освоить Java можно, записавшись на профессию «Программист Java».

Подборка основана на советах разработчиков Google, Microsoft, Luxoft и Amazon.com и их личном опыте в изучении Java. Некоторые книги доступны только в оригинале, что служит веским аргументом учить технический английский. Мы пишем об этом в статье «10 советов, как быстро выучить технический английский».

Head First Java, 2nd Edition (Изучаем Java)
Kathy Sierra (Кэти Сьера)

Книга для новичков. Оптимально подойдет для быстрого старта в изучении Java. Вместе с чтением этой книги рекомендуем записаться на наш бесплатный курс по основам Java-программирования.

Introduction to Programming in Java: An Interdisciplinary Approach
Robert Sedgewick

Книга не просто учит Java, она учит использовать данный язык, как инструмент. В ней вы найдете массу полезных упражнений. Помимо этого есть сайт с дополнительной информацией, полностью посвященный этой книге — Introduction to Programming in Java.

Core java (Java. Библиотека профессионала, том 1-2)
Cay S. Horstmann (Кей С. Хорстманн)

Это одна из самых всеобъемлющих книг по Java. В ней описаны все необходимые средства языка и библиотеки. Здесь только факты и углубленные исследования, которые помогут в написании реальных программ.

Thinking in Java (Философия Java)
Bruce Eckel (Брюс Эккель)

Эта книга заслужено является частым ответом на вопрос: «с чего начинать учить Java?». Но если вы только начинаете изучать язык и при этом не имеете программистского бэкграунда, то можете ее не осилить. В таком случае лучше начать с чего-то более простого и традиционного.

Effective Java: Programming Language Guide (Java. Эффективное программирование)
Joshua Bloch (Джошуа Блох)

Джеймс Гослинг, автор языка Java, когда эта книга вышла, сказал: «Некоторые, возможно, думают, что мне не нужны никакие книги по Java, но эта мне нужна.» Здесь вы найдете более 50-ти лучших практик и советы по усовершенствованию кода от выдающегося эксперта в даной области.

Clean code (Чистый код)
Robert Martin (Роберт Мартин)

Книга о том, как писать код так, чтобы его понимали. Она научит отличать плохой код от хорошего и трансформировать плохой код в хороший. Но стоит помнить о том, что некоторые мысли там выражаются слишком категорично и поэтому могут быть неправильно восприняты новичками.

Clean coder
Robert Martin

Это более гуманитарная книга об отношении к работе. Она затрагивает тему коммуникации и дает общий обзор того, что значит быть профессиональным программистом.

Java Concurrency in Practice
Brian Goetz

Если вы имеете серьезные намерения насчет разработки на Java, то нельзя игнорировать параллелизм и многопоточность. Книга вооружит вас концепциями и техниками, необходимыми для написания безопасных и масштабируемых программ под новейшие платформы.

Java Puzzlers
Joshua Bloch and Neal Gafter

Книга написана в соавторстве главного инженера с Java-евангелистом Google. Она состоит из 95-ти обучающих головоломок, которые будет понятны всем, кто имеет навыки работы с Java, но даже для самых опытных ветеранов эти задачки покажутся сложными.

SCJP Sun Certified Programmer for Java 6 Exam 310-065 (Книга для подготовки к экзамену на сертификат Java программиста)

Учебное пособие для подготовке к сдаче SCJP экзамена.

Algorithms in Java (Алгоритмы на Java)
Robert Sedgewick (Роберт Седжвик)

Книга для того, чтобы попрактиковаться на задачках, набить руку в программировании и прокачать мозг.

Однако одного чтения книг недостаточно. «Главное побыстрее выучить основы и искать работу стажера или Juniora, а там уже знания будут накапливаться по экспоненте, если человек не ленивый, конечно. Я начал программировать, когда действительно клюнул петух в одно место — поставили уже на работе конкретную задачу и дали сроки. На работу попал Junior’ом по устному собеседованию, считаю что повезло и мне сделали большое одолжение» — говорит Дмитрий Фатеев, Senior Java Developer в Luxoft Russia.

А в полной мере освоить Java можно, записавшись на профессию «Программист Java».

Многопоточность Thread, Runnable


Многопоточное программирование позволяет разделить представление и обработку информации на несколько «легковесных» процессов (light-weight processes), имеющих общий доступ как к методам различных объектов приложения, так и к их полям. Многопоточность незаменима в тех случаях, когда графический интерфейс должен реагировать на действия пользователя при выполнении определенной обработки информации. Потоки могут взаимодействовать друг с другом через основной «родительский» поток, из которого они стартованы.

В качестве примера можно привести некоторый поток, отвечающий за представление информации в интерфейсе, который ожидает завершения работы другого потока, загружающего файл, и одновременно отображает некоторую анимацию или обновляет прогресс-бар. Кроме того этот поток может остановить загружающий файл поток при нажатии кнопки «Отмена».

Создатели Java предоставили две возможности создания потоков: реализация (implementing) интерфейса Runnable и расширение(extending) класса Thread. Расширение класса — это путь наследования методов и переменных класса родителя. В этом случае можно наследоваться только от одного родительского класса Thread. Данное ограничение внутри Java можно преодолеть реализацией интерфейса Runnable, который является наиболее распространённым способом создания потоков.

Преимущества потоков перед процессами

  • потоки намного легче процессов поскольку требуют меньше времени и ресурсов;
  • переключение контекста между потоками намного быстрее, чем между процессами;
  • намного проще добиться взаимодействия между потоками, чем между процессами.

Главный поток

Каждое java приложение имеет хотя бы один выполняющийся поток. Поток, с которого начинается выполнение программы, называется главным. После создания процесса, как правило, JVM начинает выполнение главного потока с метода main(). Затем, по мере необходимости, могут быть запущены дополнительные потоки. Многопоточность — это два и более потоков, выполняющихся одновременно в одной программе. Компьютер с одноядерным процессором может выполнять только один поток, разделяя процессорное время между различными процессами и потоками.

Класс Thread

В классе Thread определены семь перегруженных конструкторов, большое количество методов, предназначенных для работы с потоками, и три константы (приоритеты выполнения потока).

Конструкторы класса Thread

  • target – экземпляр класса реализующего интерфейс Runnable;
  • name – имя создаваемого потока;
  • group – группа к которой относится поток.

Пример создания потока, который входит в группу, реализует интерфейс Runnable и имеет свое уникальное название :

Группы потоков удобно использовать, когда необходимо одинаково управлять несколькими потоками. Например, несколько потоков выводят данные на печать и необходимо прервать печать всех документов поставленных в очередь. В этом случае удобно применить команду ко всем потокам одновременно, а не к каждому потоку отдельно. Но это можно сделать, если потоки отнесены к одной группе.

Несмотря на то, что главный поток создаётся автоматически, им можно управлять. Для этого необходимо создать объект класса Thread вызовом метода currentThread().

Методы класса Thread

Наиболее часто используемые методы класса Thread для управления потоками :

  • long getId() — получение идентификатора потока;
  • String getName() — получение имени потока;
  • int getPriority() — получение приоритета потока;
  • State getState() — определение состояния потока;
  • void interrupt() — прерывание выполнения потока;
  • boolean isAlive() — проверка, выполняется ли поток;
  • boolean isDaemon() — проверка, является ли поток «daemon»;
  • void join() — ожидание завершения потока;
  • void join(millis) — ожидание millis милисекунд завершения потока;
  • void notify() — «пробуждение» отдельного потока, ожидающего «сигнала»;
  • void notifyAll() — «пробуждение» всех потоков, ожидающих «сигнала»;
  • void run() — запуск потока, если поток был создан с использованием интерфейса Runnable;
  • void setDaemon(bool) — определение «daemon» потока;
  • void setPriority(int) — определение приоритета потока;
  • void sleep(int) — приостановка потока на заданное время;
  • void start() — запуск потока.
  • void wait() — приостановка потока, пока другой поток не вызовет метод notify();
  • void wait(millis) — приостановка потока на millis милисекунд или пока другой поток не вызовет метод notify();
Мастер Йода рекомендует:  CTT - счетчик трафика

Жизненный цикл потока

При выполнении программы объект Thread может находиться в одном из четырех основных состояний: «новый», «работоспособный», «неработоспособный» и «пассивный». При создании потока он получает состояние «новый» (NEW) и не выполняется. Для перевода потока из состояния «новый» в «работоспособный» (RUNNABLE) следует выполнить метод start(), вызывающий метод run().

Поток может находиться в одном из состояний, соответствующих элементам статически вложенного перечисления Thread.State :

NEW — поток создан, но еще не запущен;
RUNNABLE — поток выполняется;
BLOCKED — поток блокирован;
WAITING — поток ждет окончания работы другого потока;
TIMED_WAITING — поток некоторое время ждет окончания другого потока;
TERMINATED — поток завершен.

Пример использования Thread

В примере ChickenEgg рассматривается параллельная работа двух потоков (главный поток и поток Egg), в которых идет спор, «что было раньше, яйцо или курица?». Каждый поток высказывает свое мнение после небольшой задержки, формируемой методом ChickenEgg.getTimeSleep(). Побеждает тот поток, который последним говорит свое слово.

При выполнении программы в консоль было выведено следующее сообщение.

Невозможно точно предсказать, какой поток закончит высказываться последним. При следующем запуске «победитель» может измениться. Это происходит вследствии так называемого «асинхронного выполнения кода». Асинхронность обеспечивает независимость выполнения потоков. Или, другими словами, параллельные потоки независимы друг от друга, за исключением случаев, когда бизнес-логика зависимости выполнения потоков определяется предусмотренными для этого средств языка.

Интерфейс Runnable

Интерфейс Runnable содержит только один метод run() :

Метод run() выполняется при запуске потока. После определения объекта Runnable он передается в один из конструкторов класса Thread.

Пример класса RunnableExample, реализующего интерфейс Runnable

При выполнении программы в консоль было выведено следующее сообщение.

Синхронизация потоков, synchronized

В процессе функционирования потоки часто используют общие ресурсы приложения, определенные вне потока. Если несколько потоков начнут одновременно вносить изменения в общий ресурс, то результаты выполнения программы могут быть непредсказуемыми. Рассмотрим следующий пример :

В примере определен общий ресурс в виде класса CommonObject, в котором имеется целочисленное поле counter. Данный ресурс используется внутренним классом, создающим поток CounterThread для увеличения в цикле значения counter на единицу. При старте потока полю counter присваивается значение 1. После завершения работы потока значение res.counter должно быть равно 4.

Две строчки кода класса CounterThread закомментированы. О них речь пойдет ниже.

В главном классе программы SynchronizedThread.main запускается пять потоков. То есть, каждый поток должен в цикле увеличить значение res.counter с единицы до четырех; и так пять раз. Но результат работы программы, отображаемый в консоли, будет иным :

То есть, с общим ресурсов res.counter работают все потоки одновременно, поочередно изменяя значение.

Чтобы избежать подобной ситуации, потоки необходимо синхронизировать. Одним из способов синхронизации потоков связан с использованием ключевого слова synchronized. Оператор synchronized позволяет определить блок кода или метод, который должен быть доступен только одному потоку. Можно использовать synchronized в своих классах определяя синхронизированные методы или блоки. Но нельзя использовать synchronized в переменных или атрибутах в определении класса.

Блокировка на уровне объекта

Блокировать общий ресурс можно на уровне объекта, но нельзя использовать для этих целей примитивные типы. В примере следует удалить строчные комментарии в классе CounterThread, после чего общий ресурс будет блокироваться как только его захватит один из потоков; остальные потоки будут ждать в очереди освобождения ресурса. Результат работы программы при синхронизации доступа к общему ресурсу резко изменится :

Следующий код демонстрирует порядок использования оператора synchronized для блокирования доступа к объекту.

Блокировка на уровне метода и класса

Блокировать доступ к ресурсам можно на уровне метода и класса. Следующий код показывает, что если во время выполнения программы имеется несколько экземпляров класса DemoClass, то только один поток может выполнить метод demoMethod(), для других потоков доступ к методу будет заблокирован. Это необходимо когда требуется сделать определенные ресурсы потокобезопасными.

Каждый объект в Java имеет ассоциированный с ним монитор, который представляет своего рода инструмент для управления доступа к объекту. Когда выполнение кода доходит до оператора synchronized, монитор объекта блокируется, предоставляя монопольный доступ к блоку кода только одному потоку, который произвел блокировку. После окончания работы блока кода, монитор объекта освобождается и он становится доступным для других потоков.

Некоторые важные замечания использования synchronized

  1. Синхронизация в Java гарантирует, что два потока не могут выполнить синхронизированный метод одновременно.

  2. Оператор synchronized можно использовать только с методами и блоками кода, которые могут быть как статическими, так и не статическими.
  3. Если один из потоков начинает выполнять синхронизированный метод или блок, то этот метод/блок блокируются. Когда поток выходит из синхронизированного метода или блока JVM снимает блокировку. Блокировка снимается, даже если поток покидает синхронизированный метод после завершения из-за каких-либо ошибок или исключений.
  4. Синхронизация в Java вызывает исключение NullPointerException, если объект, используемый в синхронизированном блоке, не определен, т.е. равен null.
  5. Синхронизированные методы в Java вносят дополнительные затраты на производительность приложения. Поэтому следует использовать синхронизацию, когда она абсолютно необходима.
  6. В соответствии со спецификацией языка нельзя использовать synchronized в конструкторе, т.к. приведет к ошибке компиляции.

Примечание : для синхронизации потоков можно использовать объекты синхронизации Synchroniser’s пакета java.util.concurrent.

Взаимная блокировка

С использованием блокировок необходимо быть очень внимательным, чтобы не создать «взаимоблокировку», которая хорошо известна разработчикам. Этот термин означает, что один из потоков ждет от другого освобождения заблокированного им ресурса, в то время как сам также заблокировал один из ресурсов, доступа к которому ждёт второй поток. В данном процессе могут участвовать два и более потоков.

Основные условия возникновения взаимоблокировок в многопотоковом приложении :

  • наличие ресурсов, которые должны быть доступны только одному потоку в произвольный момент времени;
  • при захвате ресурса поток пытается захватить еще один уникальный ресурс;
  • отсутствует механизм освобождения ресурса при продолжительном его удержании;
  • во время исполнения несколько потоков могут захватить разные уникальные ресурсы и ждать друг от друга их освобождения.

Взаимодействие между потоками в Java, wait и notify

При взаимодействии потоков часто возникает необходимость приостановки одних потоков и их последующего извещения о завершении определенных действий в других потоков. Так например, действия первого потока зависят от результата действий второго потока, и надо каким-то образом известить первый поток, что второй поток произвел/завершил определенную работу. Для подобных ситуаций используются методы :

  • wait() — освобождает монитор и переводит вызывающий поток в состояние ожидания до тех пор, пока другой поток не вызовет метод notify();
  • notify() — продолжает работу потока, у которого ранее был вызван метод wait();
  • notifyAll() — возобновляет работу всех потоков, у которых ранее был вызван метод wait().

Все эти методы вызываются только из синхронизированного контекста (синхронизированного блока или метода).

Рассмотрим пример «Производитель-Склад-Потребитель» (Producer-Store-Consumer). Пока производитель не поставит на склад продукт, потребитель не может его забрать. Допустим производитель должен поставить 5 единиц определенного товара. Соответственно потребитель должен весь товар получить. Но, при этом, одновременно на складе может находиться не более 3 единиц товара. При реализации данного примера используем методы wait() и notify().

Листинг класса Store

Класс Store содержит два синхронизированных метода для получения товара get() и для добавления товара put(). При получении товара выполняется проверка счетчика counter. Если на складе товара нет, то есть counter

Kниги и проекты для возможности практиковаться по многопоточности в Java?

Занимаюсь разработкой на Java довольно давно (преимущественно веб-приложения), за последнее время пробовал себя на пару интересных вакансий Java Developer`а (связных с высоконагруженными веб-проектами, где очень интересно себя попробовать), но к сожалению, не все получилось. Хоть в требованиях знания multithreading явно не заявлялись, определенная часть собеседования все равно так или иначе сводится к этой области Java Core. Мои же знания в этой области, как раз хромают очень сильно, думаю это как раз и один из самых существенных минусов в моих знаниях. В своей повседневной практике не приходилось писать многопточные приложения, а теоретические знания сводятся к прочтению 1-2 глав в книгах по Java, где тема покрывается «по верхам», практика же сводилась к паре простеньких программ, чтобы «пощупать». Отсутствие практики так же привело к тому, что по этой теме почти не читаю статей.

Порекомендуйте 1-2 хороших книг (а может хороший он-лайн курс), по глубокому изложению многопоточности, кроме того хотелось бы найти куда практически можно «приложить» свои знания, порекомендуйте open source проект или может кто-то ведет собственный проект со подобными задачами?

7 небольших советов для новичков в Java

В этой статье я подобрал 7 простых, но эффективных практик для начинающих Java разработчиков.

Отдаем предпочтение «ленивой» инициализации

Желательно создавать или инициализировать объекты только тогда, когда это необходимо. Например, ленивая инициализация полезна, когда сам процесс инициализации связан с какой-либо тяжелой операцией, например запрос в БД.

Для проверки строки на пустоту используем метод isEmpty()

Есть несколько вариантов проверки строки на пустоту. Одним из самых популярных является метод equals(«») — не стоит так писать.
Лучшим способом проверить строку на пустоту является использование метода isEmpty() . Этот метод просто сравнивает длину строке с нулем, используя метод length() , поэтому эта операция является менее затратной.

vchernogorov / _readme.md

Многопоточность в Java

Данный гист содержит основную информацию, которую нужно знать о Java Standart Edition.

Monitor — высокоуровневый механизм взаимодействия и синхронизации процессов, обеспечивающий доступ к неразделяемым ресурсам.

  • При многозадачности, основанной на мониторах, компилятор или интерпретатор прозрачно для программиста вставляет код блокировки-разблокировки в оформленные соответствующим образом процедуры, избавляя программиста от явного обращения к примитивам синхронизации.

Semaphore — семафор, самый простой тип блокировки, ограничивает количество потоков, которые могут войти в заданный участок кода.

  • Семафоры используются для синхронизации и защиты передачи данных через разделяемую память, а также для синхронизации работы процессов и потоков.

Mutex — двоичный простейший семафор, который может находиться в одном из двух состояний: отмеченном или неотмеченном. Он отличается от семафора тем, что только владеющий им поток может его освободить, т.е. перевести в отмеченное состояние.

  • Задача мьютекса — защита объекта от доступа к нему других потоков, отличных от того, который завладел мьютексом.
  • В каждый конкретный момент только один поток может владеть объектом, защищённым мьютексом.
  • Если другому потоку будет нужен доступ к переменной, защищённой мьютексом, то этот поток блокируется до тех пор, пока мьютекс не будет освобождён.

Reentrant mutex — мьютекс, который может быть залочен несколько раз одиним и тем же процессом/потоком без создания взаимной блокировки.

Lock — блокировка, механизм синхронизации, позволяющий обеспечить исключительный достп к разделяемому ресурсу между несколькими потоками.

  • Мягкая блокировка — каждый поток пытается получить блокировку перед доступом к соответствующему разделямому ресурсу.
  • Обязательная блокировка — попытка несанкционированного доступа к заблокированному ресурсу будет прервана, через создание исключения в потоке, который пытался получить доступ.

Spinlock — тип блокировки, который заставляет поток в бесконечном цикле пытаться получить доступ к блокировке.

  • Так как поток остается активным но не выполянет полезной работы, то использование данной блокировки не эффективно.

Deadlock — взаимное исключение, блокировка, при которой несколько процессов находятся в состоянии бесконечного ожидания ресурсов, занятых самими этими процессами.

Livelock — взаимное исключение, блокировка, при которой несколько процессов находятся в состоянии бесконечного зацикливания и не производят полезной работы.

Process — процесс обладает автономной средой выполнения.


  • Каждый процесс, в частности, имеет собственную область памяти.
  • Процесс обычно воспринимается, как синоним выполнению программы или приложения. Однако бывает, что одна приложения занимает несколько процессов.
  • Большинство реализаций JVM запускаются в едином процессе.
  • Java приложение может создать дополнительный процесс с помощью ProcessBuilder объекта.

Thread — потоки иногда называют легковесными процессами (lightweight processes). Потоки существуют внутри процесса — каждый процесс обладает хотя бы одним потоком.

  • Потоки делят ресурсы процесса, включая память и открытые файлы.
  • Приложение может быть как однопоточным, так и многопоточным, но всегда существует единственный «главный» поток, с которого запускается приложение.

Interrupt — прерывание является указанием потоку остановить выпонение.

Join — позволяет одному потоку ждать окончание выполнения другого потока.

Thread safe — участок кода, который работает корректно как в однопоточной, так и в многопоточной среде.

  • Not thread safe — участок кода, который работает корректо только в однопоточной среде.
Мастер Йода рекомендует:  5 популярных IDE для программирования на C++

Thread affinity — при старте потока, можно указать в рантайм среде, чтобы поток был привязан к определенному ядру.

EDT (Event Dispatching Thread) — специальный поток, используемый для обработки событий из очереди событий. Такой подход является концептом событийно-ориентированного программирования.

  • Такие GUI фреймворки, как, например, AWT или Swing, используют EDT.

Race condition — ошибка проектирования многопоточной системы или приложения, при которой работа системы или приложения зависит от того, в каком порядке выполняются части кода.

Context switches — когда планировщик временно приостанавливает работу потока, чтобы активировать другой поток.

  • Частое явление в приложениях с кучей потоков, что очень дорого им обходится из-за:
  • Сохранение и восстановление выполняемого контекста
  • Непостоянное местоположение в памяти
  • Затрачивание CPU на планирование потоков, которое нужно тратить на их использование.

Atomic action (Атомарная операция) — операция, выполняющаяся как единое целое, либо не выполняющаяся вовсе.

  • Атомарная операция не может быть прервана: она либо выполняется полностьбю, либо не выполняется вовсе.
  • Атомарная операция не производит изменений внешней среды во время выполнения, только по окончании.
  • Атомарная операция открыта влиянию только одного потока.

Happened-before relationship — отношение «выполняется прежде» двух событий, которое гарантирует, что память, записанная событием A будет видна для события B, т.е. событие А завершает свою запись перед тем, как B начнет чтение.

  • Данное отношение транзитивно, иррефлексивно, антисимметрично.
  • Транзитивно — для любых 3-х событий a, b, c, если событие a происходит перед b, и b происходит перед c, тогда a должно происходить перед c.
  • Иррефлексивно — ни одно событие не должно происходить перед собой.
  • Антисимметрично — если событие a должно произойти перед событием b, то обратное невозможно.

Critical section — участок кода, в котором производится доступ к общему ресурсу, который не должен быть одновременно использован более чем одним потоком.

  • Мьютекс является процедурой входа/выхода из критической секции.

sleep() — заставляет поток остановить свое выполнение на указанное время. При этом поток не теряет контроль над монитором.

start() — запускает данный поток из текущего потока.

  • Этот метод вызывает run() метод этого же потока.

run() — наследники Thread должны перегружать данный метод. Он вызывается при старте потока.

interrupt() — прерывает выпонение потока.

  • InterruptedException — данный поток получит это исключение, если произошло успешное прерывание потока.
  • ClosedByInterruptException — если данный поток был заблокирован I/O операцией, то поток получит это исключение по окончанию прерывания.

setPriority() — изменяет приоритет данного потока.

  • Минимальный приоритет — 1, максимальный — 10.

join() — заставляет поток ждать не более чем указанное время, чтобы завершиться.

  • Реализация данного метода использует цикл с вызовом wait() , который вызывается пока isAlive . После завершения потока вызывается notifyAll() метод.
  • Он создан для того, чтобы приложения не использовали методы wait() , notify , notifyAll методы из Thread сущностей, так как это не рекомендованно.
  • Если не указывать время или указать 0, то поток будет ждать вечно чтобы умереть. пичаль.

setDaemon() — отмечает данный поток как поток-демон или пользовательский поток.


  • JVM отрубается если все запущенный потоки являются демонами.
  • Этот метод должен выполняться перед стартом потока.

yield() — указывает планировщику, что текущий поток закончил свое выполнение и готов перейти в пользование процессора. Планировщик однаком может игнорировать это указание.

  • Использование данного метода редко является уместным. Он может использоваться для дебага или тестирования.

Собеседование по Java — многопоточность (вопросы и ответы)

Вопросы и ответы для собеседования Java по теме — многопоточность.

К списку вопросов по всем темам

Вопросы

1. Дайте определение понятию “процесс”.
2. Дайте определение понятию “поток”.
3. Дайте определение понятию “синхронизация потоков”.
4. Как взаимодействуют программы, процессы и потоки?
5. В каких случаях целесообразно создавать несколько потоков?
6. Что может произойти если два потока будут выполнять один и тот же код в программе?
7. Что вы знаете о главном потоке программы?
8. Какие есть способы создания и запуска потоков?
9. Какой метод запускает поток на выполнение?
10. Какой метод описывает действие потока во время выполнения?
11. Когда поток завершает свое выполнение?
12. Как синхронизировать метод?
13. Как принудительно остановить поток?
14. Дайте определение понятию “поток-демон”.
15. Как создать поток-демон?
16. Как получить текущий поток?
17. Дайте определение понятию “монитор”.
18. Как приостановить выполнение потока?
19. В каких состояниях может пребывать поток?
20. Что является монитором при вызове нестатического и статического метода?
21. Что является монитором при выполнении участка кода метода?
22. Какие методы позволяют синхронизировать выполнение потоков?
23. Какой метод переводит поток в режим ожидания?
24. Какова функциональность методов notify и notifyAll?
25. Что позволяет сделать метод join?
26. Каковы условия вызова метода wait/notify?
27. Дайте определение понятию “взаимная блокировка”.
28. Чем отличаются методы interrupt, interrupted, isInterrupted?
29. В каком случае будет выброшено исключение InterruptedException, какие методы могут его выбросить?
30. Модификаторы volatile и метод yield().
31. Пакет java.util.concurrent
32. Есть некоторый метод, который исполняет операцию i++. Переменная i типа int. Предполагается, что код будет исполнятся в многопоточной среде. Следует ли синхронизировать блок?
33. Что используется в качестве mutex, если метод объявлен static synchronized? Можно ли создавать новые экземпляры класса, пока выполняется static synchronized метод?
34. Предположим в методе run возник RuntimeException, который не был пойман. Что случится с потоком? Есть ли способ узнать о том, что Exception произошел (не заключая все тело run в блок try-catch)? Есть ли способ восстановить работу потока после того как это произошло?
35. Какие стандартные инструменты Java вы бы использовали для реализации пула потоков?
36.Что такое ThreadGroup и зачем он нужен?
37.Что такое ThreadPool и зачем он нужен?
38.Что такое ThreadPoolExecutor и зачем он нужен?
39.Что такое «атомарные типы» в Java?
40.Зачем нужен класс ThreadLocal?
41.Что такое Executor?
42.Что такое ExecutorService?
43.Зачем нужен ScheduledExecutorService?

Ответы

1. Дайте определение понятию “процесс”.

Процесс — это совокупность кода и данных, разделяющих общее виртуальное адресное пространство. Процессы изолированы друг от друга, поэтому прямой доступ к памяти чужого процесса невозможен (взаимодействие между процессами осуществляется с помощью специальных средств). Для каждого процесса ОС создает так называемое «виртуальное адресное пространство», к которому процесс имеет прямой доступ. Это пространство принадлежит процессу, содержит только его данные и находится в полном его распоряжении. Операционная система же отвечает за то, как виртуальное пространство процесса проецируется на физическую память.

Многопоточность в Java: http://habrahabr.ru/post/164487/

2. Дайте определение понятию “поток”.

Один поток («нить» или «трэд») – это одна единица исполнения кода. Каждый поток последовательно выполняет инструкции процесса, которому он принадлежит, параллельно с другими потоками этого процесса.

Thinking in Java.Параллельное выполнение. http://wikijava.it-cache.net/index.php@title=Glava_17_Thinking_in_Java_4th_edition.html

3. Дайте определение понятию “синхронизация потоков”.

Синхронизация относится к многопоточности. Синхронизированный блок кода может быть выполнен только одним потоком одновременно.

Java поддерживает несколько потоков для выполнения. Это может привести к тому, что два или более потока получат доступ к одному и тому же полю или объекту. Синхронизация — это процесс, который позволяет выполнять все параллельные потоки в программе синхронно. Синхронизация позволяет избежать ошибок согласованности памяти, вызванных непоследовательным доступом к общей памяти.
Когда метод объявлен как синхронизированный — нить держит монитор для объекта, метод которого исполняется. Если другой поток выполняет синхронизированный метод, ваш поток заблокируется до тех пор, пока другой поток не отпустит монитор.
Синхронизация достигается в Java использованием зарезервированного слова synchronized. Вы можете использовать его в своих классах определяя синхронизированные методы или блоки. Вы не сможете использовать synchronized в переменных или атрибутах в определении класса.

Синхронизация потоков, блокировка объекта и блокировка класса info.javarush.ru: http://goo.gl/gW4ONp

4. Как взаимодействуют программы, процессы и потоки?

Чаще всего одна программа состоит из одного процесса, но бывают и исключения (например, браузер Chrome создает отдельный процесс для каждой вкладки, что дает ему некоторые преимущества, вроде независимости вкладок друг от друга). В каждом процессе может быть создано множество потоков. Процессы разделены между собой (>программы), потоки в одном процессе могут взаимодействовать друг с другом (методы wait, notify, join и т.д.).

5. В каких случаях целесообразно создавать несколько потоков?

Многопоточные приложения применяются в случаях, когда можно разделить программу на несколько относительно независимых частей. В этом случае чтобы один код не ждал другой их помещают в различные потоки. В качестве примера можно привести программу с графическим интерфейсом — пока выполняются какие-либо длительные вычисления в одном потоке, интерфейс может быть доступен пользователю и не зависать, если он выполняется в другом потоке.

6. Что может произойти если два потока будут выполнять один и тот же код в программе?

Если используются не синхронизированные данные, то может произойти ситуация, когда код работает уже с устаревшими данными. Например, в первом потоке идет изменение каких-либо полей, а в это время второй поток читает эти поля.

7. Что вы знаете о главном потоке программы?

Маленькие программы на Java обычно состоят из одной нити, называемой «главной нитью» (main thread). Но программы побольше часто запускают дополнительные нити, их еще называют «дочерними нитями». Главная нить выполняет метод main и завершается. Аналогом такого метода main, для дочерних нитей служит метод run интерфейса Runnable. Много потоков — много методов main (run()).

8. Какие есть способы создания и запуска потоков?

Существует несколько способов создания и запуска потоков.

С помощью класса, реализующего Runnable

  • Создать объект класса Thread .
  • Создать объект класса, реализующего интерфейс Runnable
  • Вызвать у созданного объекта Thread метод start() (после этого запустится метод run() у переданного объекта, реализующего Runnable )

С помощью класса, расширяющего Thread

  • Создать объект класса ClassName extends Thread .
  • Переопределить run() в этом классе (смотрите пример ниже, где передается имя потока ‘Second’)

С помощью класса, реализующего java.util.concurrent.Callable

  • Создать объект класса, реализующего интерфейс Callable
  • Создать объект ExecutorService с указанием пула потоков.
  • Создать объект Future. Запуск происходит через метод submit() ; Сигнатура: Future submit(Callable task)

Многопоточность в Java

Продолжаем изучать стандартную библиотеку языка программирования Java. И сегодня речь пойдет о многопоточности:

  • что такое многопоточность;
  • как ее реализовать;
  • как создать о остановить потоки выполнения.

Для начала, нужно разобрать, что же такое многопоточность и для чего она нужна. Долго расписывать не буду.


Многопоточность — это свойство системы выполнять несколько вычислений одновременно, тем самым ускоряя процесс этого вычисления. Например, когда Вы играете в компьютерные игры, вы видите, что Ваш персонаж выполняет определенное действие, другие персонажи, анимация, звук. Это все отдельные потоки если говорить примитивно.

В языке Java есть стандартный класс, который реализует многопоточность: Thread, который имплементирует Runable интерфейс. Для того, чтобы реализовать многопоточность в своей программе нужно унаследовать свой класс от Thread или имплементировать интерфейс Runable. Нечто похожее мы делали, когда создавали свои классы исключения в статье о исключениях. Но это еще не все. В классе Thread есть метод run() и start(), которые созданы чтобы делать вычисления и запускать выполнение кода соответственно. То есть в методе run() мы пишем, что хотим выполнить, а когда вызываем метод start(), он автоматически запускает наш код в run. Вот такая многоходовочка)). Все гораздо проще, когда смотришь на код.

Многопоточность, с чего начать?

Добрый день. Суть такова, что с многопоточностью вообще до этого не сталкивался(было процедурное програмирование, ООП программирование но многопоточность не видел в глаза) Нет, я конечно могу рассказать 2 способа создания потока в джаве через наследование от Потока и интерфейс runnable, но на этом в моих знаниях можна ставить точку.
Итак, с чего начать? Не нужен госу уровень, но нужно хотя бы умение сделать простую лабу/распаралелить какое нибудь простое вычисление/разбить какое-то действие на несколько потоков. Нужно ли сначала разбираться с java memory model?
Да, если у кого есть простейшие задачи/лабы по многопоточности — скиньте пожалуйста.

Если у кого есть пример кода по простой задаче на многопоточность по типу такого —

есть список файлов, нужно вернуть список всех слов из пяти букв из всех файлов, но для каждого файла искать в отдельном потоке. (ну короче на разделение работы на несколько потоков)

21.09.2014, 16:24

С чего начать
Возможно (даже точно) я кинул вопрос не в ту тему, но все же. Буквально на днях изучил структуру.

подскажите с чего начать
8. Имеется шахматная доска. Некоторые поля не ней заняты белыми фигурами и пешками. Каждая занятое.

С чего начать Spring?
Хочу освоить Spring фреймворк, в нем ни бум-бум, толком даже не понимаю что это да как. .

С чего начать изучать Java SE
Добрый вечер,народ подскажите с чего начать изучать Java SE,сам язык не знаю,сказали что начать.

Посоветуйте с чего начать новичку
Добрый день, уважаемые Java программисты :senor: Посоветуйте с чего начать новичку изучать Java.

Мастер Йода рекомендует:  10 способов эффективно справиться с Null в Java

JLesson 35. Многопоточность в Java. Часть 1.

Современные многоядерные процессорные архитектуры позволяют осуществлять параллельные вычисления, и тема многопоточности сейчас актуальна как никогда.

Java, в отличие от многих других языков программирования, изначально разрабатывался с поддержкой многопоточности. Многопоточность в Java существует на уровне самого языка. Хотя и на В цикле статей, посвященных данной теме, мы разберем основу создания приложений с поддержкой параллельных вычислений, модель памяти Java (JMM) и пакет java.util.concurrency, являющийся дополнительным инструментом для использования в многопоточных приложениях.

Процессы и потоки.

Любая операционная система неразрывно связана с понятием процесса, логической абстракции, представляющей собой выполняющуюся программу. Каждый процесс в операционной системе имеет в своем распоряжении свое адресное пространство памяти, в котором хранятся его код и данные. Но иногда может быть полезным разделить выполняющуюся программу на ряд отдельных подпроцессов. Здесь то и появляется понятия потока.

Поток – это мини-процесс, выполняющийся внутри программы. Время, которое затрачивает операционная система на переключение контекста между процессами значительно превышает время, которое требуется на переключение между потоками.

В современных приложениях, работающих с сетью, часто применяется создание отдельного от основного потока приложения для загрузки данных из сети. Основной поток в этот момент может быть занят тем, что принимает команды от пользователя и отображает что-то на экране. И это только один пример.

Современные операционные системы вкупе с современным железом позволяют вам запускать несколько программ одновременно, сами программы внутри себя могут запускать множество потоков, выполняющая самые различные действия — загрузку данных из сети, вычисления, обработку какой-то информации.

В конце концов сейчас мы живем в мире, когда существуют большие данные (Big Data), которые нужно не просто хранить, но их нужно и обрабатывать. Конечно, мощности современных устройств уже позволяют выполнять некоторую обработку даже на компьютерах пользователей, но создание параллельных вычислений может ускорить работу, распределив нагрузку между несколькими процессорами. А имея в своем распоряжении многоядерный процессор, почему бы не воспользоваться таким преимуществом?

Но писать многопоточные программы все же не так просто, хотя и язык Java максимально облегчает нам эту задачу, а модель памяти JMM говорит нам о том, что можно сделать для того, чтобы получить некоторую долю уверенности в адекватной работе нашего приложения на разных операционных системах.

Главный поток.

При запуске вашей программы на языке Java стартует главный поток приложения. Ссылку на него можно получить, вызывав статический метод currentThread() класса Thread.

Soft, интернет, безопасность: новости, статьи, советы, работа

Избранное сообщение

Фетісов В. С. Комп’ютерні технології в тестуванні. Навчально-методичний посібник. 2-ге видання, перероблене та доповнене / Мои публикации

В 10-х годах я принимал участие в программе Европейского Союза Tempus «Освітні вимірювання, адаптовані до стандартів ЄС». В рамк.

суббота, 27 февраля 2020 г.

Производительность и многопоточность на Java-конференции JPoint 2020 / Программирование на Java

Всего 8 недель осталось до крупнейшей в России Java-конференции JPoint 2020. Я уже рассказывал на хабре, что нас с вами ожидает:

  • два дня под одной крышей в центре Москвы
  • около 40 докладов в четырёх параллельных залах. Мы хотели сделать 36 докладов, как на Joker, но видимо всё же, уплотним сетку и сделаем 44 доклада
  • море общения с коллегами — около 1000 Java-программистов приедут к нам отовсюду

Я попробую потихоньку рассказать про основные темы JPoint и начну с нашей любимой — производительность и многопоточность.

На эту тему уже анонсированы следующие доклады:

  • Алексей Шипилёв, Oracle — Если не Unsafe, то кто: восход VarHandles
  • Сергей Куксенко, Oracle — Quantum Performance Effects, level up. За пределами ядра
  • Руслан Черёмин, Deutsche Bank — Escape Analysis и скаляризация
  • Владимир Ситников, NetCracker — Ну и производительность у вашего OpenSource!
  • Volker Simonis, SAP — HotSpot Intrinsics
  • Алексей Шипилёв, Oracle — The Lord of the Strings: Two Scours
  • Тагир Валеев — Stream API puzzlers
  • Владимир Иванов, Oracle — Native код, Off-heap данные и Java
  • Владимир Озеров, Gr />

Алексей Шипилёв, Oracle — Если не Unsafe, то кто: восход VarHandles

Алексей работает над производительностью Java около 10 лет. За это время он успел позаниматься Apache Harmony в Intel, затем перешёл в Sun Microsystems, а потом и в Oracle, где сегодня работает над Sun/Oracle JDK, главным образом над изменениями, связанными с производительностью JVM, библиотек классов, фреймворков и приложений. Разрабатывает и поддерживает под-проекты OpenJDK: JMH, jcstress, JOL. Работает в экспертных группах, связанных с формализацией, тестированием и производительностью concurrency.

Алексей много раз выступал на JPoint, а в прошлом году — так и вовсе разорвал всех в клочья.

В этом докладе будет дан обзор работ вокруг VarHandles (JEP 193): что там за API, как в крупную клетку устроена референсная реализация, какие новые режимы доступа (acquire/release, opaque/relaxed, compareAndSet/compareAndExchange) она даёт, и как мы умудряемся её скомпилировать в практически голые доступы.

Кроме того, мы посмотрим на то, какой sun.misc.Unsafe плохой, какие грабли нам подкладывают текущие JDK/JVM, какие хардварные проблемы подтачивают красивый гранит реализации. С позитивной стороны мы увидим побочные улучшения в JDK/JVM: оптимизации в ByteBuffers, Atomic*FieldUpdaters, и прочие общие кодогенерационные улучшения.

Руслан Черёмин, Deutsche Bank — Escape Analysis и скаляризация

Руслан давно занимается производительностью Java-решений и ведет популярный блог про Performance, на который постоянно ссылаются все, кто так или иначе занимается перфомансом в русскоязычном мире. Если вас интересует джавовский перфоманс и вы еще не подписаны на блог Руслана — непременно подпишитесь. Ну и почитайте его прямо на ближайших выходных — взрыв мозга гарантирован!

И кстати, Руслан уже выступал на JPoint и JUG три года назад. Вот видео его доклада про Disruptor:

Теперь про текущий доклад.

Escape analysis и Scalar replacement появились в Java еще в версии 6.0, и их включение действительно заметно снижает нагрузку на GC. Но вот надежного понимания, в каких конкретных участках кода на скаляризацию можно положиться, а в каких – нет, у Руслана за эти годы так и не сложилось. В сети можно найти массу историй успеха в духе «а вот в таком коде совсем-совсем нет аллокаций!», но приведенный код часто оказывается очень хрупким: иногда достаточно поправить одну-две строчки, как все волшебство исчезает.

Доклад — попытка привнести больше понимания в этот вопрос. Будет кратко описан сам алгоритм escape-анализа и его врожденные ограничения, и на примерах будут рассмотрены ограничения реализации его в HotSpot JVM JIT.

Владимир Ситников, NetCracker — Ну и производительность у вашего OpenSource!

Владимир более 10 лет работает над производительностью и масштабируемостью NetCracker OS — ПО, используемого операторами связи для автоматизации процессов управления сетью и сетевым оборудованием. Увлекается вопросами производительности Java и Oracle Database. Автор более десятка улучшений производительности в официальном PostgreSQL JDBC драйвере.

Общедоступные программы и библиотеки подкупают своей бесплатностью. Если же исходный код открыт, то все сразу думают, что «умные дядьки уже исправили всё, что нужно». На практике же оказывается, что грабли разложены там, где их мало кто ждёт. Тормозит всё, кроме, разве что, самой java. В докладе мы рассмотрим примеры проблем производительности при использовании таких библиотек как Wildfly, Spring, HornetQ, pgjdbc.

Например, оказывается, что spring.getBean тормозит, а в комбинации с autoproxy вообще может занимать до 50% времени приложения. Cglib мешает работе garbage collector’а в попытках проксировать Object#finalize, а HornetQ внезапно притормаживает отправку JMS, что запросто приводит к 5-и секундным задержкам на одно сообщение. Владимир расскажет, как их опознать и обезвредить.

Сергей Куксенко, Oracle — Quantum Performance Effects, level up. За пределами ядра

Сергей — Java Performance Engineer, работает с Java начиная с версии 1.0. За это время успел поучаствовать в разработке мобильных, клиентских, серверных приложений, а также виртуальных машин. Производительностью Java занимается уже более 10 лет: сначала работал в Intel над Apache Harmony, а в данный момент в Oracle занимается производительностью OracleJDK/OpenJDK (его 3-я JVM).

Сергей сделает доклад, который будет продолжением его предыдущего хардкорного доклада про Quantum Performance Effects. Подробности будут со дня на день, а пока — вот вам видео первой части:

Алексей Шипилёв, Oracle — The Lord of the Strings: Two Scours

java.lang.String — один из наиболее часто используемых классов в Java приложениях. Не удивительно, что инженеры Oracle пытаются его улучшать и микро-, и макро-оптимизациями. В докладе будут освещены вопросы рациональности, подходов к реализации, практических граблей, с которыми сталкиваются разработчики JDK, пытающиеся ничего не сломать в огромной экосистеме, а также чем эта подковёрная деятельность грозит простым пользователям.

В этом докладе будут рассмотрены две грядущие фичи в JDK 9, направленные на оптимизацию строк: Compact Strings, сжимающие строки с однобайтовыми символами, что улучшает футпринт и даже общую производительность; и Indify String Concat, использующий магию invokedynamic для конкатенации строк, позволяющий подкручивать реализацию конкатенации без рекомпиляции программ.

Тагир Валеев — Stream API puzzlers

На хабре Тагир известен как lany, лидер Java-хаба, и одно это делает ему хорошую рекламу 🙂 Тагир разрабатывает и поддерживает системы автоматизации научных исследований в области генетики, молекулярной и системной биологии. Участвует в проекте статического анализа кода FindBugs. Разрабатывает открытую библиотекуStreamEx, расширяющую возможности Java 8 Stream API. Читает лекции по машинной графике в НГУ.

На разных конференциях было много докладов на тему, что такое Stream API и как им пользоваться. В докладе мы сосредоточимся на деталях реализации: какие операции выполняются быстро, какие медленно, какие неожиданно кушают много памяти, какие просто ведут себя странно. Будет разобрано, какие баги есть в Java 8 Stream API и что будет исправлено в Java 9. Кроме того будет показано, как решать некоторые нетривиальные задачи. Ну и, конечно, будет немного рекламы OpenSource-библиотекиStreamEx.

Владимир Иванов, Oracle — Native код, Off-heap данные и Java

Владимир — ведущий инженер Oracle, работает в группе разработки виртуальной Java-машины HotSpot. Специализируется на JIT-компиляции и поддержке альтернативных языков на платформе Java. Работает над созданием новых механизмов работы с native кодом и off-heap данными (Project Panama).

Доклады у Владимира обычно зубодробительны. Предыдущий обзор новинок в JVM Владимир делал полтора года назад на Joker 2014:

О чем же расскажет Владимир в этот раз?

Работа с native кодом и off-heap данными из Java привлекательна, но сопряжена с рядом трудностей. Разговор пойдет о существующих методах взаимодействия с native кодом и способах работы с off-heap данными. Существенная часть доклада будет отведена рассказу о нововведениях в JDK 9 (JEP 193: VarHandles) и тому, что планируется на более отдаленную перспективу в Project Panama: новый интерфейс для доступа к native-коду, идущий на смену JNI (JEP 191: Foreign Function Interface), Layout Descriptor Language (LDL) и Arrays 2.0.

Владимир Озеров, Gr />
Владимир — архитектор компании GridGain. Комитер и PMC member проекта Apache Ignite. Занимается вопросами распределенных вычислений, кэширования и репликации, интеграцией с .NET/C++, разработкой модулей для экосистемы Hadoop.

Неблокирующая синхронизация — полезный и мощный инструмент многопоточного программирования. Но зачастую знания разработчиков о ней ограничиваются словами «круто», «сложно» и «перфоманс». Как именно использовать неблокирующие алгоритмы на практике? Чем конкретно они могут помочь джависту? И где спрятан тот самый перфоманс?

В докладе будут рассмотрены задачи, решаемые неблокирующей синхронизацией в мире Java. Вместе с Владимиром слушатели

  • прорвутся через дебри заумной теории;
  • выделят основные кирпичики построения неблокирующих алгоритмов;
  • научатся сочетать блокирующие и неблокирующие техники;
  • разберут примеры из реальных проектов — удачные и не очень.
Volker Simonis, SAP — HotSpot Intrinsics

Фолькер — JVM-инженер с огромным опытом, работает над SAP JVM. Он является контрибьютором OpenJDK с самого начала ее существования и помогает SAP вносить различные улучшения в HotSpot JVM. Фолькер возглавляет проект по портированию OpenJDK на PowerPC/AIX, коммитит в JDK8 и ревьюит коммиты в JDK9.

На прошлом JPoint Фолькер рассказывал про различные подходы к ускорению работы с массивами объектов:

В этот раз Фолькер расскажет про JVM Intrinsics — специальные функции внутри HotSpot и других JVM, которые позволяют вашему коду выполняться быстрее. Как мы знаем HotSpot JVM работает на огромном количестве платформ, и поэтому весь его код более-менее поделен на общий и специфичный для конкретного железа или конкретной операционки (а иногда для пары железо+ОС). Соответственно, в ряде случаев исполняемый код можно ускорить, если использовать специальные процессорные инструкции. Типичный пример — использовать для методов типа AtomicInteger.getAndAdd(int) инструкции типа lock add вместо CAS-loop’а. Или, например, использовать SIMD-инструкции для методов equals и hashCode на строках.

В данном докладе будет дан обзор существующих в HotSpot интринсиков и будет объяснено, как они реализованы, как можно контролировать их использование и, наконец, как можно добавить intrinsic в ваш любимый Java-метод.

Добавить комментарий