Please open Telegram to view this post
VIEW IN TELEGRAM
🤣15🔥4❤1
Что делает ключевое слово var в Java и когда его стоит использовать?
Пример
public class Main {
public static void main(String[] args) {
var message = "Привет, мир!";
var number = 42;
System.out.println(message.toUpperCase()); // ➔ ПРИВЕТ, МИР!
System.out.println(number + 8); // ➔ 50
}
}Ответ
var позволяет не указывать явно тип переменной, если он может быть выведен компилятором. Это делает код короче и чище, особенно при работе с дженериками и лямбдами.
📌 Важно: var — это не динамическая типизация. Тип переменной всё равно определяется во время компиляции, и после — изменить его нельзя.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
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 особенно полезен для флагов завершения, простых статусов и неблокирующих операций, где требуется только гарантированная видимость, но не атомарность или защита критических секций.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁15🔥5🤣2
Как работает 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. Закрытие ресурса гарантируется даже при исключениях.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
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 или создании неблокирующих структур данных, где важна скорость и потокобезопасность без тяжёлых блокировок.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁15🔥7
Чем 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(), что даёт гибкость, но требует дисциплины.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
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 особенно полезен для синхронизации в тестах, многопоточных вычислениях и в случаях, когда нужно дождаться инициализации нескольких компонентов перед стартом основной логики.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2