Easy Java
5.22K subscribers
311 photos
51 videos
463 links
Лучшие обучающие материалы и другие полезности для Java-разработчиков.

Сотрудничество: @heywan_n1

Цены: @heywan_media

Реклама на бирже: https://telega.in/c/+r8kkGSypBY84MmIy
Download Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
Ответ:
Anonymous Quiz
36%
1
32%
2
19%
3
13%
4
👩‍💻 Что такое Semaphore в Java и зачем он нужен?

Semaphore — это синхронизатор из пакета java.util.concurrent, который ограничивает количество потоков, одновременно обращающихся к ресурсу. Он работает как счётчик разрешений (permits): поток должен получить разрешение, чтобы продолжить работу, и обязан его освободить после завершения.

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


• Контролирует доступ к общим ресурсам
• Поддерживает справедливый режим (fair) для очередности
• Помогает избежать перегрузки системных ресурсов

⚡️ Пример:

import java.util.concurrent.Semaphore;

public class Main {
private static final Semaphore semaphore = new Semaphore(2); // максимум 2 потока одновременно

public static void main(String[] args) {
Runnable task = () -> {
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + " получил доступ");
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " освобождает доступ");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
};

for (int i = 1; i <= 5; i++) {
new Thread(task, "Поток " + i).start();
}
}
}


👀 Semaphore особенно полезен в системах, где необходимо ограничить количество одновременных операций — например, при обращении к API с лимитами, управлении пулом соединений или ограничении нагрузки на сервис.


➡️ Easy Java | #Теория
Please open Telegram to view this post
VIEW IN TELEGRAM
5
📖 Как заменить GitHub Copilot на полностью офлайн‑Continue Plugin

Покажу, как приручить Continue вместо Copilot: подключу локальную LLM, всё без сети — файлы не утекут. Настройка в IDE+LM Studio, фишки, грабли, бенч, выводы.

Читать статью

➡️ Easy Java | #Статья
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Вот вот

➡️ Easy Java | #Мемы
Please open Telegram to view this post
VIEW IN TELEGRAM
😁21
Вопрос с собеса

Что такое ConcurrentHashMap в Java и чем он отличается от HashMap?

Пример🔽
import java.util.concurrent.ConcurrentHashMap;
import java.util.Map;

public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new ConcurrentHashMap<>();

map.put("A", 1);
map.put("B", 2);

map.forEach((k, v) -> {
System.out.println(k + " = " + v);
map.put("C", 3); // не вызовет ConcurrentModificationException
});

System.out.println(map);
}
}


Ответ🔽
HashMap не является потокобезопасной: если несколько потоков одновременно изменяют её, возможны ошибки и ConcurrentModificationException.

ConcurrentHashMap — это потокобезопасная альтернатива, которая:
— позволяет одновременно читать и писать без полной блокировки всей карты
— делит данные на сегменты для повышения производительности
— гарантирует согласованность данных при многопоточном доступе

📌 Если работа только в одном потоке — можно использовать обычный HashMap. Если данные разделяются между потоками — правильнее брать ConcurrentHashMap.


➡️ Easy Java | #Собес
Please open Telegram to view this post
VIEW IN TELEGRAM
5🤯1
Please open Telegram to view this post
VIEW IN TELEGRAM
Ответ:
Anonymous Quiz
32%
1
44%
2
8%
3
17%
4
👩‍💻 Что такое Exchanger в Java и зачем он нужен?

Exchanger — это синхронизатор из пакета java.util.concurrent, который позволяет двум потокам обмениваться данными в точке встречи. Каждый поток вызывает метод exchange(), и когда оба потока доходят до этой точки, они обмениваются переданными объектами.

Это удобно, когда два потока должны координировать свои действия, передавая результаты вычислений друг другу.


• Позволяет безопасно обмениваться объектами между потоками
• Подходит для реализации producer-consumer моделей
• Удобен для синхронных этапов вычислений

⚡️ Пример:

import java.util.concurrent.Exchanger;

public class Main {
public static void main(String[] args) {
Exchanger<String> exchanger = new Exchanger<>();

Runnable producer = () -> {
try {
String data = "Данные от Producer";
System.out.println("Producer отправил: " + data);
String response = exchanger.exchange(data);
System.out.println("Producer получил: " + response);
} catch (InterruptedException e) {
e.printStackTrace();
}
};

Runnable consumer = () -> {
try {
String data = "Ответ от Consumer";
System.out.println("Consumer отправил: " + data);
String received = exchanger.exchange(data);
System.out.println("Consumer получил: " + received);
} catch (InterruptedException e) {
e.printStackTrace();
}
};

new Thread(producer).start();
new Thread(consumer).start();
}
}


👀 Exchanger особенно полезен, когда два потока выполняют разные задачи и должны регулярно обмениваться результатами — например, генератор данных и обработчик, или два этапа сложного расчёта.


➡️ Easy Java | #Теория
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2
📖 Хватит терять время! Ускоряем сборку с помощью Spring Test Profiler

Покажу: Spring Test Profiler находит лишние перезапуски контекста и рассинхрон конфигов; унифицирую окружение, чиню кэш и ускоряю интеграц-тесты. Будет чек-лист.

Читать статью

➡️ Easy Java | #Статья
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Ответ:
Anonymous Quiz
27%
OOV
7%
VOO
62%
OVV
4%
VVO
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13
Вопрос с собеса

Что такое WeakReference в Java и зачем она используется?

Пример🔽
import java.lang.ref.WeakReference;

public class Main {
public static void main(String[] args) {
String strong = new String("Hello");
WeakReference<String> weak = new WeakReference<>(strong);

System.out.println("До GC: " + weak.get()); // ➔ Hello

strong = null;
System.gc(); // просим сборщик мусора освободить память

System.out.println("После GC: " + weak.get()); // ➔ null (объект мог быть удалён)
}
}


Ответ🔽
WeakReference позволяет держать ссылку на объект, не мешая сборщику мусора его удалить. Как только на объект не остаётся сильных (обычных) ссылок, GC может освободить память, даже если есть WeakReference.

📌 Основные применения:
— кэши, где не критично хранить данные постоянно
— структуры, которые не должны мешать очистке памяти
— предотвращение утечек в долгоживущих коллекциях.


➡️ Easy Java | #Собес
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Ответ:
Anonymous Quiz
18%
1
16%
2
40%
3
26%
4
👩‍💻 Что такое DelayQueue в Java и зачем она нужна?

DelayQueue — это потокобезопасная очередь из java.util.concurrent, где элементы становятся доступными только после истечения заданного времени задержки. Элементы должны реализовывать интерфейс Delayed.

Она удобна для отложенной обработки задач — таймеров, кэшей с TTL, планировщиков.


• Элементы выдаются только после задержки
• Работает в многопоточном режиме
• Идеальна для задач с таймаутами

⚡️ Пример:

import java.util.concurrent.*;

class Task implements Delayed {
long start = System.currentTimeMillis() + 1000;
public long getDelay(TimeUnit u) { return u.convert(start - System.currentTimeMillis(), TimeUnit.MILLISECONDS); }
public int compareTo(Delayed o) { return Long.compare(getDelay(TimeUnit.MILLISECONDS), o.getDelay(TimeUnit.MILLISECONDS)); }
public String toString() { return "Задача выполнена"; }
}

public class Main {
public static void main(String[] args) throws Exception {
DelayQueue<Task> q = new DelayQueue<>();
q.put(new Task());
System.out.println(q.take()); // ждём 1 сек
}
}


👀 DelayQueue особенно полезна для отложенных задач, TTL-кэшей и планировщиков.


➡️ Easy Java | #Теория
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍2
📖 Разработка на Java без всего

Снова показываю как можно вести разработку «голыми руками» — без IDE, документации и даже интернета. На этот раз с помощью «пользовательской» Ubuntu Linux и OpenJDK.

Читать статью

➡️ Easy Java | #Статья
Please open Telegram to view this post
VIEW IN TELEGRAM