Easy Java
Ir al canal en Telegram
Лучшие обучающие материалы и другие полезности для Java-разработчиков. Сотрудничество: @heywan_n1 Цены: @heywan_media Реклама на бирже: https://telega.in/c/+r8kkGSypBY84MmIy
Mostrar más5 037
Suscriptores
-224 horas
-187 días
-7430 días
Archivo de publicaciones
5 036
👩💻 Что такое CountDownLatch в Java и зачем он нужен?
CountDownLatch — это синхронизатор из пакета java.util.concurrent, который позволяет одному или нескольким потокам ждать, пока другие потоки завершат свои задачи.
Он инициализируется счётчиком, и каждый вызов countDown() уменьшает его на 1. Как только счётчик достигает нуля — все ожидающие потоки продолжают выполнение.• Удобен для ожидания завершения группы потоков • Позволяет синхронизировать старт или окончание работы • Прост в использовании и потокобезопасен ⚡️ Пример:
import java.util.concurrent.CountDownLatch;
public class Main {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(3);
Runnable worker = () -> {
System.out.println(Thread.currentThread().getName() + " завершил работу");
latch.countDown();
};
new Thread(worker, "Поток 1").start();
new Thread(worker, "Поток 2").start();
new Thread(worker, "Поток 3").start();
latch.await(); // ждём, пока счётчик не станет 0
System.out.println("Все потоки завершили работу");
}
}
👀 CountDownLatch особенно полезен для синхронизации в тестах, многопоточных вычислениях и в случаях, когда нужно дождаться инициализации нескольких компонентов перед стартом основной логики.➡️ Easy Java | #Теория
5 036
❓ Вопрос с собеса
Чем ReentrantLock отличается от synchronized в Java?
Пример🔽
import java.util.concurrent.locks.ReentrantLock;
public class Main {
private static final ReentrantLock lock = new ReentrantLock();
private static int counter = 0;
public static void main(String[] args) {
Runnable task = () -> {
lock.lock();
try {
counter++;
} finally {
lock.unlock();
}
};
new Thread(task).start();
new Thread(task).start();
}
}
Ответ🔽
ReentrantLock — это класс из java.util.concurrent.locks, который предоставляет больше возможностей, чем synchronized: — Можно пытаться захватить блокировку с таймаутом (tryLock) — Можно использовать блокировку с несколькими условиями (Condition) — Можно вручную управлять моментом захвата и освобождения 📌 В отличие от synchronized, ReentrantLock требует явного вызова lock() и unlock(), что даёт гибкость, но требует дисциплины.➡️ Easy Java | #Собес
5 036
👨👨👨👨👨👨👨👨👨👨
Каналы с Junior IT вакансиями
и стажировками
Подписывайся и забирай свой оффер 🤘
1. Стажировки и вакансии по России и миру
2. IT вакансии по СНГ
3. IT стажировки по СНГ
4. IT стажировки и волонтерства
5. IT стажировки в топовых компаниях мира
6. Удалённые IT вакансии и стажировки
7. Python вакансии и стажировки
8. БИГТЕХ вакансии и стажировки
9. Design вакансии и стажировки
10. QA вакансии и стажировки
11. Junior вакансии и стажировки
12. Frontend вакансии и вопросы собесов
13. Вакансии и стажировки для аналитиков
14. Вакансии в русских стартапах за границей
15. Вакансии и стажировки для DevOps
16. Вакансии, которых нет на ХХ.РУ
5 036
Айтишники зарабатывают ДОХ#Я 💵💵
Не все, конечно, а только самые хваткие.
Кто с холодной головой и чёткой архитектурой внутри.
💼 Рынок сейчас покупает НЕ знания.
Он покупает тех, кто умеет собрать их в работающую модель
Бизнес-архитектор — канал о том, как люди в IT, бизнесе и на фрилансе собирают из своих знаний доход в несколько тысяч $ в месяц.
Подпишись и превращай знания в результат: ⤵️
https://t.me/+yEOgj-E-dYw0NWYy
https://t.me/+yEOgj-E-dYw0NWYy
5 036
👩💻 Что такое AtomicInteger в Java и зачем он нужен?
AtomicInteger — это класс из пакета java.util.concurrent.atomic, который обеспечивает атомарные операции над целыми числами без использования synchronized.
Все операции (incrementAndGet, decrementAndGet, compareAndSet) выполняются потокобезопасно благодаря низкоуровневым механизмам процессора (CAS — Compare-And-Swap).• Потокобезопасный счётчик без блокировок • Быстрее, чем
synchronized
• Подходит для высоконагруженных многопоточных систем
⚡️ Пример:
import java.util.concurrent.atomic.AtomicInteger;
public class Main {
private static final AtomicInteger counter = new AtomicInteger(0);
public static void main(String[] args) {
Runnable task = () -> {
for (int i = 0; i < 1000; i++) {
counter.incrementAndGet();
}
};
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException ignored) {}
System.out.println("Результат: " + counter.get());
}
}
👀 AtomicInteger особенно полезен при подсчёте событий, генерации ID или создании неблокирующих структур данных, где важна скорость и потокобезопасность без тяжёлых блокировок.➡️ Easy Java | #Теория
5 036
❓ Вопрос с собеса
Как работает try-with-resources в Java и чем он отличается от обычного try?
Пример🔽
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {
System.out.println(reader.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ответ🔽
try-with-resources автоматически закрывает ресурсы (файлы, потоки, соединения) после выхода из блока try. Все классы, используемые в нём, должны реализовывать интерфейс AutoCloseable. 📌 В отличие от обычного try, нет необходимости вручную вызывать close() в finally. Закрытие ресурса гарантируется даже при исключениях.➡️ Easy Java | #Собес
5 036
Миллионер-айтишник в 24 года?
Знакомьтесь — это Влад, ему 24, и он программист без высшего образования..
IT и программирование — это ниша, которая никогда не умрет и в которой нет потолка !
~ Думаешь это сложно?
Я и тебя научу зарабатывать в IT и растить себя как высококлассного специалиста мирового уровня!
Не веришь? Забирай бесплатные материалы в моем канале 👇
https://t.me/+0-MtMJkZF2BlOWM6
5 036
👩💻 В сеть вывалилась гигантская куча курсов и книг от топовых IT‑школ
Держи сотни гигабайт свежих уроков, и каждую неделю мы подкидываем ещё!
1402 ГБ — Python
1815 ГБ — Frontend
1515 ГБ — Backend
1300 ГБ — C / C++
694 ГБ — Java
546 ГБ — SQL & БД
411 ГБ — DevOps
898 ГБ — ИБ & Хакинг
212 ГБ — JavaScript
996 ГБ — Kotlin / Swift
173 ГБ — PHP
215 ГБ — GoLang
185 ГБ — Rust
517 ГБ — Linux
115 ГБ — QA / Тестирование
419 ГБ — GameDev
319 ГБ — 1C + Лицензии
617 ГБ — Машинное обучение
687 ГБ — Аналитика Данных
998 ГБ — Дизайн
Подписывайся и не плати за то, что можно получить бесплатно
5 036
👩💻 Что такое volatile в Java и зачем он нужен?
volatile — это модификатор переменной, который говорит JVM: не кэшировать значение, а всегда читать его из основной памяти. Это обеспечивает видимость изменений между потоками без использования synchronized.
Он не делает операции атомарными, но гарантирует, что все потоки увидят актуальное значение переменной, если один из потоков его изменил.• Упрощает синхронизацию • Гарантирует видимость без блокировок • Идеален для флагов и индикаторов в многопоточности ⚡️ Пример:
public class Main {
private static volatile boolean running = true;
public static void main(String[] args) throws InterruptedException {
Thread worker = new Thread(() -> {
while (running) {
// выполняем работу
}
System.out.println("Поток завершён");
});
worker.start();
Thread.sleep(1000);
running = false; // изменение станет видно в другом потоке
}
}
👀 volatile особенно полезен для флагов завершения, простых статусов и неблокирующих операций, где требуется только гарантированная видимость, но не атомарность или защита критических секций.➡️ Easy Java | #Теория
