Перейти к основному содержимому

88 записей с тегом "Java Concurrency"

Посмотреть все теги

· 3 мин. чтения

1. Введение

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

Давайте посмотрим, как мы можем добиться этого в Java — используя PriorityBlockingQueue .

2. Обзор

Допустим, у нас есть задания, которые мы хотим выполнить в зависимости от их приоритета:

· 7 мин. чтения

1. Введение

В этой статье мы подробно обсудим основную концепцию Java — жизненный цикл потока.

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

Чтобы начать понимать потоки в Java, эта статья о создании потока является хорошей отправной точкой.

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

· 7 мин. чтения

1. Обзор

В этом уроке мы рассмотрим один из самых фундаментальных механизмов в Java — синхронизацию потоков.

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

И мы разработаем простое приложение, в котором мы будем иметь дело с проблемами параллелизма, с целью лучшего понимания wait() и notify() .

2. Синхронизация потоков в Java

· 3 мин. чтения

1. Обзор

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

В этом руководстве мы рассмотрим различия и области применения обоих интерфейсов.

2. Механизм исполнения

Оба интерфейса предназначены для представления задачи, которая может выполняться несколькими потоками. Мы можем запускать задачи Runnable , используя класс Thread или ExecutorService , тогда как мы можем запускать Callable только с помощью последнего.

· 8 мин. чтения

1. Введение

Задача Dining Philosophers — одна из классических задач, используемых для описания проблем синхронизации в многопоточной среде и иллюстрации методов их решения . Дейкстра впервые сформулировал эту проблему и представил ее относительно компьютеров, обращающихся к периферийным устройствам ленточных накопителей.

Настоящая формулировка была дана Тони Хоаром, который также известен изобретением алгоритма быстрой сортировки. В этой статье мы анализируем эту известную проблему и кодируем популярное решение.

2. Проблема

./44ac2d6fd4d063653544579fe4d86361.png

· 6 мин. чтения

1. Обзор

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

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

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

2. Общая многопроцессорная архитектура

· 4 мин. чтения

1. Обзор

В этом руководстве мы рассмотрим различия между методами set() и lazySet() атомарных классов Java , таких как AtomicInteger и AtomicReference .

2. Атомарные переменные — краткий обзор

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

Они определены в пакете java.util.concurrent.atomic , и хотя их API различаются в зависимости от атомарного типа, большинство из них поддерживают методы set() и lazySet() .

· 7 мин. чтения

1. Обзор

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

В общем, мы хотим реализовать два метода и понять, как ими манипулировать:

  • недействительный замок (строковый ключ)
  • недействительная разблокировка (строковый ключ)

Для простоты руководства мы всегда будем предполагать, что наши ключи являются строками . Вы можете заменить их типом объектов, которые вам нужны, при единственном условии, что методы equals и hashCode определены правильно, потому что мы будем использовать их в качестве ключей HashMap .

2. Простой взаимоисключающий замок

· 6 мин. чтения

1. Обзор

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

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

2. Принцип синхронизации

Как правило, мы должны синхронизировать только те объекты, которые, как мы уверены, не заблокирует никакой внешний код .

· 6 мин. чтения

1. Обзор

В этом руководстве мы обсудим различные способы захвата дампа потока приложения Java.

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

В следующих разделах мы рассмотрим несколько инструментов и подходов к созданию дампа потока.

2. Использование утилит JDK