Вопросы 181-190 для опытных разработчиков
Ответ: Sleep() и wait() — это два различных метода для приостановки потока, но они работают по-разному:
| Характеристика | sleep() | wait() |
|---|---|---|
| Принадлежность | Метод класса Thread | Метод класса Object |
| Освобождение блокировки | Не освобождает lock, который держит поток | Освобождает lock, что позволяет другим потокам его получить |
| Тип метода | Статический метод | Не является статическим методом |
| InterruptedException | Не выбрасывает InterruptedException | Выбрасывает InterruptedException если поток прерван |
| Использование | Используется для задержки потока на определенное время | Используется для паузы потока, пока другой поток не пробудит его |
| Перегруженные методы | sleep(long millis), sleep(long millis, int nanos) | wait(), wait(long timeout), wait(long timeout, int nanos) |
Sleep() пример:
// Sleep() просто останавливает поток на время
try {
Thread.sleep(2000); // Поток ждет 2 секунды
System.out.println("After 2 seconds");
} catch (InterruptedException e) {
e.printStackTrace();
}
Wait() пример:
// Wait() ждет уведомления от другого потока
synchronized(obj) {
try {
obj.wait(); // Поток ждет, пока другой поток не вызовет notify()
System.out.println("Notified by another thread");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// В другом потоке:
synchronized(obj) {
obj.notify(); // Пробуждает ждущий поток
}
Ответ: Приоритеты потоков — это концепция, где каждый поток имеет приоритет, который представлен числами от 1 до 10. Существуют различные типы приоритетов потоков в Java:
| Приоритет | Значение | Константа | Описание |
|---|---|---|---|
| Минимальный | 1 | MIN_PRIORITY | Самый низкий приоритет |
| Нормальный | 5 | NORM_PRIORITY | Приоритет по умолчанию |
| Максимальный | 10 | MAX_PRIORITY | Самый высокий приоритет |
По умолчанию потокам назначается NORM_PRIORITY (5).
class PriorityThreadDemo extends Thread {
public void run() {
System.out.println("Thread: " + Thread.currentThread().getName()
+ ", Priority: " + Thread.currentThread().getPriority());
}
}
public class ThreadPriorityExample {
public static void main(String[] args) {
PriorityThreadDemo t1 = new PriorityThreadDemo();
PriorityThreadDemo t2 = new PriorityThreadDemo();
PriorityThreadDemo t3 = new PriorityThreadDemo();
t1.setPriority(Thread.MIN_PRIORITY); // Приоритет 1
t2.setPriority(Thread.NORM_PRIORITY); // Приоритет 5 (по умолчанию)
t3.setPriority(Thread.MAX_PRIORITY); // Приоритет 10
t1.start();
t2.start();
t3.start();
}
}
// Output:
// Thread: Thread-2, Priority: 10
// Thread: Thread-1, Priority: 5
// Thread: Thread-0, Priority: 1
setPriority(int newPriority) — устанавливает приоритет потокаgetPriority() — получает приоритет текущего потокаОтвет: Для Java Garbage Collection необходим для избежания утечек памяти, которые могут привести к краху программы и её нестабильности. В отличие от C++, в Java нет способа удалить сборку мусора в пользу разработчика для фокусирования на разработке приложения вместо управления ресурсами памяти и беспокойства об утечке памяти.
JVM автоматически управляет памятью, периодически запуская сборщик мусора, который освобождает неиспользуемую память в приложении.
// Без GC нужно было бы вручную освобождать память:
// Object obj = new Object();
// // использование объекта
// delete obj; // В C++ нужна явная очистка
//
// В Java это делается автоматически:
Object obj = new Object();
// использование объекта
// После того как obj больше не используется, GC удалит его автоматически
Ответ: Несмотря на множество преимуществ, Garbage Collector имеет определенные недостатки:
Проблема 1: Паузы выполнения
Проблема 2: Непредсказуемость
Проблема 3: Overhead памяти
Ответ: JVM удаляет объекты, которые больше не используются, используя сборщик мусора, который периодически проверяет и удаляет эти объекты. Существуют различные типы сборки мусора в JVM, каждый с различными характеристиками и влиянием на производительность. Основные типы сборки мусора:
| Тип | Область памяти | Объекты | Время |
|---|---|---|---|
| Minor GC | Young Generation (молодое поколение) | Краткоживущие объекты (быстро создаются и удаляются) | Выполняется часто и быстро |
| Major GC | Old Generation (старое поколение) | Долгоживущие объекты (пережили несколько minor GC) | Выполняется реже, но медленнее |
| Full GC | Все поколения (Young + Old + Permanent) | Все объекты из всех поколений | Выполняется редко, самый медленный |
Minor Garbage Collection (Young Generation GC):
Также известна как сборка мусора молодого поколения. Этот тип сборки мусора используется для сбора и восстановления памяти, которая используется объектами с коротким жизненным циклом (объектами, которые быстро создаются и отбрасываются).
Major Garbage Collection (Old Generation GC):
Также известна как сборка мусора старого поколения. Этот тип сборки мусора используется для сбора и восстановления памяти, которая используется долгоживущими объектами (объектами, которые пережили несколько minor garbage collection и продвинулись в old generation).
Full Garbage Collection:
Во время полной сборки мусора памяти из всех поколений собираются и восстанавливаются, включая памяти молодого и старого поколения. Full garbage collection обычно требует больше времени на выполнение, чем minor или major garbage collection, что вызывает, что приложение паузируется временно.
Ответ: Утечка памяти в Java происходит, когда объекты больше не нужны, но все еще имеют активные ссылки, что предотвращает сборщик мусора от удаления их из памяти. Это часто происходит из-за незакрытых ресурсов, ненужного создания объектов или сохранения ссылок дольше, чем требуется.
В результате неиспользуемые объекты накапливаются в памяти, негативно влияя на сборку мусора. Это может привести к деградации производительности или даже отказу приложения, что делает надлежащее управление ресурсами и ссылками необходимым.
// Java Program to demonstrate memory leaks
import java.io.*;
import java.util.Vector;
class GFG {
public static void main(String[] args) {
Vector a = new Vector(21312312);
Vector b = new Vector(2147412344);
Vector c = new Vector(219944);
System.out.println("Memory Leak in Java");
}
}
// Output:
// Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
// at java.base/java.util.Vector.<init>(Vector.java:142)
// at GFG.main(GFG.java:9)
Ответ: Regular Expressions или Regex в Java — это API, используемый для поиска и манипулирования строк в Java. Он создает String паттерны, которые могут извлечь нужные данные из строк или могут обобщить паттерн.
| Класс | Описание |
|---|---|
| Pattern Class | Может определять паттерны. Используется для определения регулярных выражений. |
| Matcher Class | Может выполнять операции сопоставления текста с использованием паттернов |
| PatternSyntaxException Class | Может указать синтаксическую ошибку в регулярном выражении |
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
// Определение паттерна
String pattern = "[0-9]+";
Pattern p = Pattern.compile(pattern);
String input = "There are 25 apples and 17 oranges";
Matcher m = p.matcher(input);
// Поиск всех чисел
while (m.find()) {
System.out.println("Found: " + m.group());
}
}
}
// Output:
// Found: 25
// Found: 17
Ответ: Пароль должен начинаться с алфавита, за которым следуют буквально-цифровые символы; его длина должна быть между 8 и 20.
regex = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,20}$"
import java.util.regex.*;
public class PasswordValidator {
public static void main(String[] args) {
String pattern = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,20}$";
Pattern p = Pattern.compile(pattern);
String password1 = "Secure@123";
String password2 = "weak";
Matcher m1 = p.matcher(password1);
Matcher m2 = p.matcher(password2);
System.out.println("Password1: " + m1.matches()); // true
System.out.println("Password2: " + m2.matches()); // false
}
}
Ответ: JDBC (Java Database Connectivity) standard API используется для связи Java приложений и реляционных баз данных. Она предоставляет коллекцию классов и интерфейсов, которые позволяют программистам использовать язык программирования Java для общения с базой данных. Классы и интерфейс JDBC позволяют приложению отправлять запросы, сделанные пользователями, на указанную базу данных.
Application → JDBC API → JDBC Driver Manager → JDBC Driver → SQL Server/Oracle/MySQL
Ответ: JDBC Driver — это программный компонент, который используется для включения Java приложения для взаимодействия с базой данных. JDBC предоставляет реализацию JDBC API для конкретной системы управления базой данных, которая позволяет ему подключиться к базе данных, выполнять SQL-операции и получить данные. Существует четыре типа JDBC драйверов:
Приложение → JDBC API → JDBC Driver → Oracle/MySQL/SQL Server