Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13🔥1
Зачем в Java используется ключевое слово
volatile?Пример
public class Main {
private static volatile boolean running = true;
public static void main(String[] args) throws InterruptedException {
Thread worker = new Thread(() -> {
while (running) {
// бесконечный цикл, пока running == true
}
System.out.println("Поток завершён");
});
worker.start();
Thread.sleep(1000);
running = false;
}
}Ответ
volatile говорит JVM, что переменная может изменяться в других потоках, и запрещает кэшировать её значение. Без volatile поток может "застрять", не заметив изменения переменной.
📌 volatile не делает операции атомарными, но гарантирует видимость изменений между потоками. Используется для флагов, сигналов остановки и простейшей синхронизации
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
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) {
// Выполняем работу, пока running == true
}
System.out.println("Поток завершён");
});
worker.start();
Thread.sleep(1000);
running = false; // другой поток увидит это изменение
}
}👀 volatile особенно полезен для сигналов завершения, управления флагами и других случаев, где нужна простая синхронизация без полной блокировки.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😭26😁8❤5
Что означает ключевое слово
final для переменных и параметров в Java?Пример
public class Main {
public static void main(String[] args) {
final int x = 10;
// x = 20; // Ошибка компиляции
printName("Alice");
}
static void printName(final String name) {
// name = "Bob"; // Ошибка: нельзя переназначить final-параметр
System.out.println("Имя: " + name);
}
}Ответ
final означает, что переменная не может быть переназначена после инициализации. Это касается локальных переменных, параметров метода и полей класса.
📌 final не делает объект неизменяемым, а лишь защищает ссылку от повторного присваивания. Сам объект по-прежнему может меняться, если он мутируемый
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
ThreadLocal — это специальный механизм, позволяющий хранить данные отдельно для каждого потока. Каждый поток получает свою копию значения, даже если переменная одна и та же.Это удобно, когда нужно избежать синхронизации, но при этом обеспечить потокобезопасность — например, при работе с форматированием дат, сессиями или кэшами в потоках.
• У каждого потока своё значение
• Избавляет от использования synchronized
• Удобен в многопоточном программировании и фреймворках
public class Main {
private static final ThreadLocal<Integer> threadId = ThreadLocal.withInitial(() -> (int) (Math.random() * 1000));
public static void main(String[] args) {
Runnable task = () -> System.out.println("ID потока: " + threadId.get());
new Thread(task).start();
new Thread(task).start();
new Thread(task).start();
}
}👀 ThreadLocal особенно полезен в веб-приложениях, логгерах, и при реализации механизма хранения "контекста" внутри каждого потока — например, RequestContext, SecurityContext, TransactionContext.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣10🔥1
Почему важно переопределять
equals() вместе с hashCode() в Java?Пример
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
class User {
String name;
User(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User user)) return false;
return Objects.equals(name, user.name);
}
// hashCode не переопределён!
}
public class Main {
public static void main(String[] args) {
Set<User> users = new HashSet<>();
users.add(new User("Alice"));
System.out.println(users.contains(new User("Alice"))); // ➔ false
}
}
Ответ
Если переопределить equals() без hashCode(), коллекции вроде HashSet, HashMap будут работать некорректно, потому что объект может попасть в неправильный "бакет". Даже если equals() вернёт true, hashCode() может быть разным — и объект не найдётся.
📌 Контракт: если два объекта равны по equals(), они обязаны иметь одинаковый hashCode().
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Please open Telegram to view this post
VIEW IN TELEGRAM