Java for Beginner
871 subscribers
1.01K photos
275 videos
14 files
1.68K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
🗓 История IT сегодня — 17 августа


ℹ️ Кто родился в этот день

Ло́уренс Джо́зеф «Ла́рри» Э́ллисон (англ. Lawrence Joseph «Larry» Ellison; род. 17 августа 1944 года, Бронкс, Нью-Йорк, США) сооснователь и долгосрочный руководитель Oracle Corporation; ключевая фигура в развитии коммерческих СУБД и корпоративного программного обеспечения.


🌐 Знаковые события


1958 — Pioneer 0 (Thor-Able) — первая американская попытка отправить аппарат к Луне; запуск 17 августа, авария на взлёте.

1970 программа «Венера»: запуск аппарата Венера-7, первого успешно передавшего данные с поверхности другой планеты — Венеры.

1982 — Германия/Япония: на заводе Philips (Ганновер) начинают серийно прессовать первые компакт-диски (CD); коммерческий старт CD-эры — осень 1982.


#Biography #Birth_Date #Events #17Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1🤣1
[Совет по Java #072]

Тема: ConcurrentHashMap при итерации не бросает ConcurrentModificationException — она weakly consistent.

Проблема: В отличие от обычных коллекций (HashMapArrayList), итераторы которых являются fail-fast и выбрасывают ConcurrentModificationException при обнаружении структурных изменений во время итерации, ConcurrentHashMap использует стратегию слабой согласованности (weakly consistent).

Это означает, что итератор не гарантирует, что отразит все изменения, произошедшие во время итерации, и не бросает исключения при конкурентных модификациях. Разработчики, привыкшие к fail-fast итераторам, ожидают, что при изменении карты во время обхода возникнет исключение, и могут строить логику, полагаясь на это поведение. Однако в ConcurrentHashMap это не происходит, и отсутствие исключения может замаскировать ошибки конкурентного доступа, приводя к тому, что итерация видит частично обновленные данные или пропускает новые элементы.

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

Решение: Осознайте, что итерация по ConcurrentHashMap безопасна в многопоточной среде, но не предоставляет моментального снимка (snapshot). Итератор отражает состояние карты на момент создания итератора, но может видеть изменения, произошедшие после (в зависимости от реализации). Для получения согласованного снимка используйте entrySet().toArray() или создайте копию карты перед итерацией. Если вам нужна строгая согласованность в момент обхода, синхронизируйтесь на самой карте или используйте Collections.synchronizedMap.

Однако для большинства сценариев, где не требуется полная изоляция, поведение ConcurrentHashMap вполне приемлемо и позволяет избежать исключений. Документируйте ожидаемое поведение и не полагайтесь на отсутствие исключений как на гарантию целостности данных.
public class ConcurrentHashMapIteration {

public static void main(String[] args) throws InterruptedException {
ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");

//Итерация безопасна и не бросает ConcurrentModificationException
Thread modifier = new Thread(() -> {
map.put(4, "Four"); // модификация во время итерации
map.remove(2);
});

// Итератор создается ДО изменений
var iterator = map.entrySet().iterator();
modifier.start();

// Итерация продолжается, несмотря на изменения
System.out.println("Итерация (weakly consistent):");
while (iterator.hasNext()) {
Map.Entry<Integer, String> entry = iterator.next();
System.out.println(entry.getKey() + " -> " + entry.getValue());
// Может увидеть 4, может не увидеть; 2 может быть или нет
// Исключений не будет
}
modifier.join();

// Для снимка: копирование
Map<Integer, String> snapshot = new ConcurrentHashMap<>(map);
System.out.println("Снимок: " + snapshot);
}
}


Объяснение:
 ConcurrentHashMap использует внутреннюю сегментацию (bucket-level locking) и не блокирует всю структуру при модификации. Итераторы строятся на основе текущего состояния сегментов и не хранят отдельный снимок. Они не проверяют счетчик модификаций (в отличие от fail-fast итераторов), поэтому не бросают ConcurrentModificationException.

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


#Java #советы
👍4
Что выведет код?

import java.util.concurrent.ConcurrentHashMap;

public class task170826 {

public static void main(String[] args) {

ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");

for (Integer key : map.keySet()) {
if (key == 2) {
map.remove(1);
map.remove(3);
}
}
System.out.println(map.size());
}
}


#Tasks
👍2
👍2
Что такое Criteria API в JPA? 🤓

Ответ:

Criteria API
— это программный API для построения запросов динамически, без использования строковых JPQL.

Использует объекты CriteriaBuilder, CriteriaQuery, Root, Predicate.

Позволяет строить сложные запросы с условиями, которые могут меняться в рантайме (например, фильтры поиска). Пример: cb.equal(root.get("name"), name).

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



#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1