Критерии выбора fail-fast и fail-safe
Выбор fail-fast коллекций когда:
Single-threaded окружение или контролируемая многопоточность
Важна немедленная видимость изменений
Ограниченные ресурсы памяти
Частые операции записи
Нужна предсказуемость поведения
Выбор fail-safe коллекций когда:
Высокая конкурентность чтения и записи
Read-heavy workloads
Не критична задержка видимости изменений
Достаточно памяти для copy-on-write
Нужна thread-safe семантика без внешней синхронизации
Гибридные подходы
Комбинация fail-fast и внешней синхронизации
Использование ReadWriteLock
Практические рекомендации и best practices
Общие рекомендации по выбору циклов
Предпочитайте for-each для простого последовательного обхода
Используйте индексированный for когда нужен индекс или нестандартный обход
Избегайте индексированного for для LinkedList
Рассмотрите Stream API для сложных операций фильтрации и трансформации
Рекомендации по работе с fail-fast коллекциями
Не модифицируйте коллекцию во время итерации через методы коллекции
Используйте Iterator.remove() для безопасного удаления
Собирайте изменения отдельно для пакетного применения
Синхронизируйте доступ в многопоточных сценариях
Рекомендации по работе с fail-safe коллекциями
Понимайте семантику weak consistency для concurrent коллекций
Учитывайте стоимость copy-on-write для больших коллекций
Используйте для read-heavy workloads
Избегайте частых модификаций больших CopyOnWriteArrayList
#Java #для_новичков #beginner #for_each #fail_fast #fail_safe
Выбор fail-fast коллекций когда:
Single-threaded окружение или контролируемая многопоточность
Важна немедленная видимость изменений
Ограниченные ресурсы памяти
Частые операции записи
Нужна предсказуемость поведения
// Оптимально для single-threaded сценариев
List<String> singleThreadedList = new ArrayList<>();
Выбор fail-safe коллекций когда:
Высокая конкурентность чтения и записи
Read-heavy workloads
Не критична задержка видимости изменений
Достаточно памяти для copy-on-write
Нужна thread-safe семантика без внешней синхронизации
// Оптимально для многопоточных read-heavy сценариев
List<String> concurrentList = new CopyOnWriteArrayList<>();
Гибридные подходы
Комбинация fail-fast и внешней синхронизации
public class SynchronizedListWrapper {
private final List<String> list = new ArrayList<>();
public synchronized void safeIteration() {
// Внутри synchronized блока fail-fast безопасен
for (String item : list) {
process(item);
}
}
public synchronized void modify() {
list.add("new");
}
}Использование ReadWriteLock
public class ReadWriteProtectedList {
private final List<String> list = new ArrayList<>();
private final ReadWriteLock lock = new ReentrantReadWriteLock();
public void iterateSafely() {
lock.readLock().lock();
try {
for (String item : list) {
process(item); // Безопасное чтение
}
} finally {
lock.readLock().unlock();
}
}
public void modifySafely() {
lock.writeLock().lock();
try {
list.add("new"); // Безопасная модификация
} finally {
lock.writeLock().unlock();
}
}
}Практические рекомендации и best practices
Общие рекомендации по выбору циклов
Предпочитайте for-each для простого последовательного обхода
Используйте индексированный for когда нужен индекс или нестандартный обход
Избегайте индексированного for для LinkedList
Рассмотрите Stream API для сложных операций фильтрации и трансформации
// For-each для простого обхода
for (Item item : items) {
process(item);
}
// Индексированный for когда нужен индекс
for (int i = 0; i < items.size(); i++) {
processWithIndex(items.get(i), i);
}
// Stream API для сложных операций
items.stream()
.filter(this::shouldProcess)
.map(this::transform)
.forEach(this::process);
Рекомендации по работе с fail-fast коллекциями
Не модифицируйте коллекцию во время итерации через методы коллекции
Используйте Iterator.remove() для безопасного удаления
Собирайте изменения отдельно для пакетного применения
Синхронизируйте доступ в многопоточных сценариях
// Безопасный паттерн
List<String> toRemove = new ArrayList<>();
for (String item : list) {
if (shouldRemove(item)) {
toRemove.add(item);
}
}
list.removeAll(toRemove);
Рекомендации по работе с fail-safe коллекциями
Понимайте семантику weak consistency для concurrent коллекций
Учитывайте стоимость copy-on-write для больших коллекций
Используйте для read-heavy workloads
Избегайте частых модификаций больших CopyOnWriteArrayList
// Оптимальное использование CopyOnWriteArrayList
CopyOnWriteArrayList<Data> dataCache = new CopyOnWriteArrayList<>();
// Редкое обновление всего кэша
public void refreshCache() {
List<Data> freshData = loadFreshData();
dataCache = new CopyOnWriteArrayList<>(freshData);
}
// Частое чтение
public List<Data> getCachedData() {
return dataCache;
}
#Java #для_новичков #beginner #for_each #fail_fast #fail_safe
👍2
Что выведет код?
#Tasks
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
public class Task161225 {
public static void main(String[] args) {
List<Integer> failFast = new ArrayList<>(Arrays.asList(1, 2, 3));
List<Integer> failSafe = new CopyOnWriteArrayList<>(Arrays.asList(1, 2, 3));
try {
for (int num : failFast) {
System.out.print(num + " ");
if (num == 2) failFast.add(4);
}
} catch (Exception e) {
System.out.print("FFex ");
}
try {
for (int num : failSafe) {
System.out.print(num + " ");
if (num == 2) failSafe.add(4);
}
} catch (Exception e) {
System.out.print("FSex ");
}
System.out.print(failFast.size() + " ");
System.out.print(failSafe.size());
}
}
#Tasks
👍1
Варианты ответа:
Anonymous Quiz
22%
1 2 FFex 1 2 3 FSex 3 4
11%
1 2 FFex 1 2 3 3 6
44%
1 2 FFex 1 2 3 3 4
22%
1 2 FFex 1 2 3 4 4
😱1
Spring Cloud Gateway: граница микросервисов.
Если рискнете посмотреть сегодняшнее видео, то скорее всего приобретете неплохую компетенцию по Spring Cloud Gateway.
Что я там показал и о чем рассказал:
🔵 Зачем вообще нам Gateway и что это такое.
🔵 Как происходит роутинг и как это настроить в mvc и webflux версиях.
🔵 Что такое предикаты, фильтры, и что они могут.
🔵 Как всегда немного подебажил))
Репозиторий на GitHub очень ждет Ваших звезд. Хотя-бы зацените как я для Вас постарался.☺️
Ссылка на Youtube
Ссылка на Рутьюб
Смотрите, ставьте лайки, подписывайтесь на каналы!✌️
Если рискнете посмотреть сегодняшнее видео, то скорее всего приобретете неплохую компетенцию по Spring Cloud Gateway.
Что я там показал и о чем рассказал:
Репозиторий на GitHub очень ждет Ваших звезд. Хотя-бы зацените как я для Вас постарался.
Ссылка на Youtube
Ссылка на Рутьюб
Смотрите, ставьте лайки, подписывайтесь на каналы!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6🆒1 1
Вопрос с собеседований
Что такое pessimistic locking?🤓
Ответ:
Пессимистичная блокировка предполагает высокую вероятность конфликта.
Данные блокируются сразу при чтении. Это гарантирует безопасность, но снижает производительность.
Часто используется в базах данных для защиты от одновременных обновлений.
#собеседование
Что такое pessimistic locking?
Ответ:
Данные блокируются сразу при чтении. Это гарантирует безопасность, но снижает производительность.
Часто используется в базах данных для защиты от одновременных обновлений.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2