Варианты ответа:
Anonymous Quiz
29%
IOException
12%
IOException
59%
FileNotFoundException
0%
NullPointerException
👍3
Как работает java.util.concurrent.locks.Condition?🤓
Ответ:
Condition — это интерфейс, предоставляющий более гибкий контроль потоков, чем wait()/notify().
Ассоциируется с Lock. Для объекта Lock можно создать одну или несколько Condition (через newCondition()).
Методы:
await() (освобождает lock и ждет),
signal() (пробуждает один поток),
signalAll() (пробуждает все).
Преимущества: можно иметь несколько очередей ожидания для разных условий (например, для производителя и потребителя отдельные Condition).
Также поддерживает прерывания и таймауты.
#собеседование
Ответ:
Ассоциируется с Lock. Для объекта Lock можно создать одну или несколько Condition (через newCondition()).
Методы:
await() (освобождает lock и ждет),
signal() (пробуждает один поток),
signalAll() (пробуждает все).
Преимущества: можно иметь несколько очередей ожидания для разных условий (например, для производителя и потребителя отдельные Condition).
Также поддерживает прерывания и таймауты.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
История технологии сегодня — 4 июня
ℹ️ Кто родился в этот день
Ива́н Влади́мирович Танана́ев (22 мая [4 июня] 1904 года — 28 февраля 1993 года) — советский и российский учёный-химик, специалист в области органической и аналитической химии. Под руководством Тананаева были разработаны способы переработки сырья, найдены новые области применения редкоземельных элементов, проводились исследования хроматов лантана, неодима и иттрия. Впоследствии эти наработки оказались полезными при создании высокотемпературных керамических материалов. Решил важную задачу комплексного освоения минерального сырья на Кольском полуострове. Он разработал технологию выделения из руд ценных металлов и фосфора, которая и в XXI веке применяется на заводах. Также учёный одним из первых сформулировал идеи о наноматериалах.
Кристофер Кокерелл (4 июня 1910 года, Кембридж — 1 июня 1999 года, Хайт, Гэмпшир) — британский инженер, изобретатель судна на воздушной подушке. Патентную заявку на схему судна на воздушной подушке, принципиально новую конструкцию, названную им «hovercraft» («парящий аппарат»), он подал 12 декабря 1955 года. Первый прототип построенного им судна на воздушной подушке SR-N1 (англ. SR.N1) был построен весной 1959 года и всего несколько недель спустя пересёк Ла-Манш за 20 минут.
🌐 Знаковые события
1896 — испытание первого автомобиля, построенного Фордом, было задержано на час, так как оказалось, что автомобиль шире, чем двери цеха, в котором его создавали.
#Biography #Birth_Date #Events #04июня
Ива́н Влади́мирович Танана́ев (22 мая [4 июня] 1904 года — 28 февраля 1993 года) — советский и российский учёный-химик, специалист в области органической и аналитической химии. Под руководством Тананаева были разработаны способы переработки сырья, найдены новые области применения редкоземельных элементов, проводились исследования хроматов лантана, неодима и иттрия. Впоследствии эти наработки оказались полезными при создании высокотемпературных керамических материалов. Решил важную задачу комплексного освоения минерального сырья на Кольском полуострове. Он разработал технологию выделения из руд ценных металлов и фосфора, которая и в XXI веке применяется на заводах. Также учёный одним из первых сформулировал идеи о наноматериалах.
Кристофер Кокерелл (4 июня 1910 года, Кембридж — 1 июня 1999 года, Хайт, Гэмпшир) — британский инженер, изобретатель судна на воздушной подушке. Патентную заявку на схему судна на воздушной подушке, принципиально новую конструкцию, названную им «hovercraft» («парящий аппарат»), он подал 12 декабря 1955 года. Первый прототип построенного им судна на воздушной подушке SR-N1 (англ. SR.N1) был построен весной 1959 года и всего несколько недель спустя пересёк Ла-Манш за 20 минут.
1896 — испытание первого автомобиля, построенного Фордом, было задержано на час, так как оказалось, что автомобиль шире, чем двери цеха, в котором его создавали.
#Biography #Birth_Date #Events #04июня
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🤣1
[Совет по Java #046]
Тема:
Проблема: Перечисления в Java (
Разработчики, пытающиеся добавить общее поведение в разные
Решение: Для добавления общего поведения используйте интерфейсы. Перечисление может реализовывать любое количество интерфейсов.
Вынесите общие методы в интерфейс, а затем реализуйте его в каждом enum. Если нужна общая реализация методов, используйте интерфейс с
Объяснение: Каждое перечисление — это класс, который неявно расширяет
Для сложной логики можно вынести утилитарный класс со статическими методами, работающими с
#Java #советы
Тема:
java.lang.Enum не может наследовать другой класс, потому что уже наследует Enum.Проблема: Перечисления в Java (
enum) неявно наследуются от класса java.lang.Enum. Это значит, что они не могут расширять другой класс — множественное наследование классов в Java запрещено. Разработчики, пытающиеся добавить общее поведение в разные
enum через наследование от базового класса, сталкиваются с ошибкой компиляции. Часто возникает желание создать иерархию перечислений, например, BaseEnum с общими методами и несколько enum-типов от него. Это невозможно из-за финального Enum в корне иерархии.Решение: Для добавления общего поведения используйте интерфейсы. Перечисление может реализовывать любое количество интерфейсов.
Вынесите общие методы в интерфейс, а затем реализуйте его в каждом enum. Если нужна общая реализация методов, используйте интерфейс с
default методами (Java 8+). Также можно добавить поля и конструкторы в enum, но единого предка для разных перечислений не будет. Для передачи общей логики используйте композицию или статические утилитарные методы.public class EnumInterfaces {
// Общий интерфейс для всех перечислений с кодом
interface Codified {
int getCode();
String getDescription();
}
// Базовый интерфейс с default методом
interface Named {
String getName();
default String getFormattedName() {
return "[" + getName() + "]";
}
}
// Перечисление реализует оба интерфейса
enum Status implements Codified, Named {
NEW(1, "Новый"),
PROCESSING(2, "В обработке"),
COMPLETED(3, "Завершен");
private final int code;
private final String description;
Status(int code, String description) {
this.code = code;
this.description = description;
}
@Override
public int getCode() { return code; }
@Override
public String getDescription() { return description; }
@Override
public String getName() { return name(); }
}
enum Priority implements Codified {
LOW(10, "Низкий"),
HIGH(20, "Высокий");
private final int code;
private final String description;
Priority(int code, String description) {
this.code = code;
this.description = description;
}
@Override
public int getCode() { return code; }
@Override
public String getDescription() { return description; }
}
// Полиморфная работа через интерфейс
public static void printCode(Codified c) {
System.out.println(c.getCode() + " -> " + c.getDescription());
}
public static void main(String[] args) {
printCode(Status.NEW);
printCode(Priority.HIGH);
// Использование default метода
System.out.println(Status.COMPLETED.getFormattedName()); // [COMPLETED]
}
}Объяснение: Каждое перечисление — это класс, который неявно расширяет
java.lang.Enum. JVM гарантирует, что у этого класса нет другого суперкласса, что исключает наследование от пользовательских классов. Однако перечисление может реализовывать интерфейсы, что позволяет достичь полиморфизма. Интерфейсы позволяют группировать разные enum под общей абстракцией. Если нужно переиспользовать реализацию методов, используйте default методы интерфейса (Java 8+). Для сложной логики можно вынести утилитарный класс со статическими методами, работающими с
Enum через интерфейсы или рефлексию.#Java #советы
👍5
14. Transactional Outbox: как гарантировать публикацию события
Заказ сохранился в БД, а событие в Kafka — нет. Знакомо?
В этом видео разбираем проблему dual‑write между базой данных и брокером сообщений — когда одно действие выполнено, а другое нет, и система оказывается в несогласованном состоянии.
Почему нельзя просто обернуть всё в @Transactional?
Как гарантировать, что событие будет опубликовано тогда и только тогда, когда данные сохранены?
Ответ — Transactional Outbox.
Что в видео:
Проблема dual‑write — наглядно показываю, как заказ сохраняется, а событие теряется.
Transactional Outbox — что это такое, как работает и почему это стандарт надёжной публикации.
Реализация в Spring Boot:
Таблица outbox_event (Liquibase) JPA сущность и репозиторий
Модификация OrderService – убираю прямую отправку в Kafka
Polling Publisher (@Scheduled) – простой способ доставки событий
Исходный код проекта на GitHub наверняка заслуживает Ваших звезд!🙂
Ссылка на Youtube
Ссылка на Рутьюб
Смотрите, ставьте лайки, подписывайтесь на каналы!✌️
Жду ваших реакций и оценок🙂
Заказ сохранился в БД, а событие в Kafka — нет. Знакомо?
В этом видео разбираем проблему dual‑write между базой данных и брокером сообщений — когда одно действие выполнено, а другое нет, и система оказывается в несогласованном состоянии.
Почему нельзя просто обернуть всё в @Transactional?
Как гарантировать, что событие будет опубликовано тогда и только тогда, когда данные сохранены?
Ответ — Transactional Outbox.
Что в видео:
Проблема dual‑write — наглядно показываю, как заказ сохраняется, а событие теряется.
Transactional Outbox — что это такое, как работает и почему это стандарт надёжной публикации.
Реализация в Spring Boot:
Таблица outbox_event (Liquibase) JPA сущность и репозиторий
Модификация OrderService – убираю прямую отправку в Kafka
Polling Publisher (@Scheduled) – простой способ доставки событий
Исходный код проекта на GitHub наверняка заслуживает Ваших звезд!
Ссылка на Youtube
Ссылка на Рутьюб
Смотрите, ставьте лайки, подписывайтесь на каналы!
Жду ваших реакций и оценок
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Что выведет код?
#Tasks
public enum Task040626 {
FIRST, SECOND;
static String msg = getMsg();
static String getMsg() {
return "hello";
}
Task040626() {
System.out.print(getLength());
}
static int getLength() {
return msg.length();
}
public static void main(String[] args) {
System.out.print("main");
}
}#Tasks
👍2
👍3
Что такое ReadWriteLock? Когда применять?🤓
Ответ:
ReadWriteLock (интерфейс, реализация ReentrantReadWriteLock) разделяет блокировки на чтение и запись.
Правила: несколько потоков могут одновременно захватить блокировку чтения, если нет блокировки записи.
Блокировка записи эксклюзивна — захватывается только одним потоком, и при этом не должно быть активных читателей. Это повышает производительность в системах с частыми чтениями и редкими записями (например, кэш, конфигурация).
Поток, захвативший блокировку чтения, не может "апгрейдиться" до блокировки записи (приведет к deadlock).
#собеседование
Ответ:
Правила: несколько потоков могут одновременно захватить блокировку чтения, если нет блокировки записи.
Блокировка записи эксклюзивна — захватывается только одним потоком, и при этом не должно быть активных читателей. Это повышает производительность в системах с частыми чтениями и редкими записями (например, кэш, конфигурация).
Поток, захвативший блокировку чтения, не может "апгрейдиться" до блокировки записи (приведет к deadlock).
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
История технологии сегодня — 5 июня
ℹ️ Кто родился в этот день
Де́неш Га́бор (Деннис Габор) (венг. Gábor Dénes; 5 июня 1900, Будапешт — 9 февраля 1979, Лондон) — венгерский физик, лауреат Нобелевской премии по физике в 1971 году «за изобретение и развитие голографического метода».
Джон Кауч А́дамс (англ. John Couch Adams; устаревшие написания: Джон Кух Адамс, Джон Кук Адамс, 5 июня 1819, Корнуолл, Англия — 21 января 1892, Кембридж, Англия) — британский математик и астроном, иностранный член-корреспондент Петербургской академии наук, член Лондонского королевского общества. Его наиболее известным достижением было предсказание существования и положения в пространстве Нептуна при помощи одной лишь математики (планета, открытая «на кончике пера»). Расчёты были проведены для объяснения отклонений в орбите Урана от законов Кеплера и Ньютона.
Рудольф Эрнст Па́йерлс (англ. Rudolf Ernst Peierls; 5 июня 1907, Берлин — 19 сентября 1995, Оксфорд) — английский физик-теоретик немецкого происхождения. В 1939 году вместе с Нильсом Бором и Георгом Плачеком исследовал механизм ядерных реакций, индуцированных нейтронами, на основе сформулированной ими оптической теоремы и представлений о составном ядре. В 1940 году совместно с Отто Фришем оценил критическую массу урана-235, которая оказалась не столь велика, как считалось ранее. Этот результат был изложен в так называемом «меморандуме Фриша — Пайерлса», который во многом инициировал широкомасштабные исследования возможности создания ядерного вооружения. Пайерлс также участвовал в вычислениях характеристик цепных реакций и разработке методов разделения изотопов.
🌐 Знаковые события
1783 — французские изобретатели братья Монгольфье в родном городке Анноне запустили на высоту 500 м первый в мире тепловой аэростат (воздушный шар).
1977 — в продаже появился первый персональный компьютер Apple II.
1998 — запущен Open Directory Project.
2025 — выход игровой системы Nintendo Switch 2.
#Biography #Birth_Date #Events #05июня
Де́неш Га́бор (Деннис Габор) (венг. Gábor Dénes; 5 июня 1900, Будапешт — 9 февраля 1979, Лондон) — венгерский физик, лауреат Нобелевской премии по физике в 1971 году «за изобретение и развитие голографического метода».
Джон Кауч А́дамс (англ. John Couch Adams; устаревшие написания: Джон Кух Адамс, Джон Кук Адамс, 5 июня 1819, Корнуолл, Англия — 21 января 1892, Кембридж, Англия) — британский математик и астроном, иностранный член-корреспондент Петербургской академии наук, член Лондонского королевского общества. Его наиболее известным достижением было предсказание существования и положения в пространстве Нептуна при помощи одной лишь математики (планета, открытая «на кончике пера»). Расчёты были проведены для объяснения отклонений в орбите Урана от законов Кеплера и Ньютона.
Рудольф Эрнст Па́йерлс (англ. Rudolf Ernst Peierls; 5 июня 1907, Берлин — 19 сентября 1995, Оксфорд) — английский физик-теоретик немецкого происхождения. В 1939 году вместе с Нильсом Бором и Георгом Плачеком исследовал механизм ядерных реакций, индуцированных нейтронами, на основе сформулированной ими оптической теоремы и представлений о составном ядре. В 1940 году совместно с Отто Фришем оценил критическую массу урана-235, которая оказалась не столь велика, как считалось ранее. Этот результат был изложен в так называемом «меморандуме Фриша — Пайерлса», который во многом инициировал широкомасштабные исследования возможности создания ядерного вооружения. Пайерлс также участвовал в вычислениях характеристик цепных реакций и разработке методов разделения изотопов.
1783 — французские изобретатели братья Монгольфье в родном городке Анноне запустили на высоту 500 м первый в мире тепловой аэростат (воздушный шар).
1977 — в продаже появился первый персональный компьютер Apple II.
1998 — запущен Open Directory Project.
2025 — выход игровой системы Nintendo Switch 2.
#Biography #Birth_Date #Events #05июня
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Раздел 11. Работа с файлами, I/O и сетью (NIO.2)
Глава 1. Классический Java I/O (java.io)
FileOutputStream – запись байтов в файл. Путь данных от heap к диску
Как и
Конструкторы и режимы открытия файла
Режим перезаписи (append = false)
При открытии в режиме перезаписи конструктор выполняет следующую последовательность:
Валидация пути. Проверка на null, проверка родительской директории на существование и возможность создания файла.
Создание или усечение файла. Системный вызов
Установка позиции записи. Указатель файла устанавливается в начало — позицию 0.
Создание объекта. Выделение
Этот режим опасен при случайном использовании: открытие существующего файла на запись без
Режим добавления (append = true)
Режим добавления открывает файл с флагами
Это критично для сценариев, где несколько процессов или потоков пишут в один файл параллельно: каждая запись добавляется в конец без риска перезаписи данных другого писателя.
Однако
#Java #для_новичков #beginner #IO #NIO #FileOutputStream
Глава 1. Классический Java I/O (java.io)
FileOutputStream – запись байтов в файл. Путь данных от heap к диску
FileOutputStream — конкретная реализация OutputStream, предназначенная для записи байтов в файл файловой системы. Он представляет собой низкоуровневый мост между Java-кодом и операционной системой: каждый вызов write() транслируется в системный вызов write() ядра ОС, который взаимодействует с файловой системой, страничным кэшем и, в конечном итоге, с блочным устройством хранения.Как и
FileInputStream, FileOutputStream не выполняет внутреннюю буферизацию. Каждый вызов write(int) напрямую обращается к ОС, что делает посимвольную запись крайне неэффективной. Однако именно эта прямота делает FileOutputStream полезным как underlying поток для буферизующих оберток (BufferedOutputStream) или как инструмент для сценариев, где требуется точный контроль над моментом физической записи.Конструкторы и режимы открытия файла
FileOutputStream предоставляет несколько конструкторов, различающихся способом указания файла и режимом открытия:// Перезапись: если файл существует, содержимое уничтожается
public FileOutputStream(String name) throws FileNotFoundException
// Режим добавления: запись начинается с конца существующего файла
public FileOutputStream(String name, boolean append) throws FileNotFoundException
// Аналогичные конструкторы с File вместо String
public FileOutputStream(File file) throws FileNotFoundException
public FileOutputStream(File file, boolean append) throws FileNotFoundException
Режим перезаписи (append = false)
При открытии в режиме перезаписи конструктор выполняет следующую последовательность:
Валидация пути. Проверка на null, проверка родительской директории на существование и возможность создания файла.
Создание или усечение файла. Системный вызов
open() с флагами O_WRONLY | O_CREAT | O_TRUNC. Если файл существует, его содержимое уничтожается, размер сбрасывается в ноль. Если файл не существует, создается новый пустой файл.Установка позиции записи. Указатель файла устанавливается в начало — позицию 0.
Создание объекта. Выделение
FileOutputStream в heap JVM, инициализация полей, включая FileDescriptor с файловым дескриптором ОС.Этот режим опасен при случайном использовании: открытие существующего файла на запись без
append = true безвозвратно удаляет его содержимое. В production-коде рекомендуется явно указывать режим, даже если требуется перезапись, для самодокументирования намерений.Режим добавления (append = true)
Режим добавления открывает файл с флагами
O_WRONLY | O_CREAT | O_APPEND. Ключевое отличие: флаг O_APPEND гарантирует атомарное позиционирование указателя в конец файла перед каждой операцией записи. Это критично для сценариев, где несколько процессов или потоков пишут в один файл параллельно: каждая запись добавляется в конец без риска перезаписи данных другого писателя.
// Безопасное добавление в лог-файл из нескольких потоков
public void appendToLog(String message) throws IOException {
byte[] data = message.getBytes(StandardCharsets.UTF_8);
try (FileOutputStream fos = new FileOutputStream("app.log", true)) {
fos.write(data);
fos.write('\n');
}
}
Однако
FileOutputStream с append = true не обеспечивает потокобезопасность на уровне Java: два потока, одновременно вызывающие write(), могут перемешать байты внутри одного вызова, так как write(byte[]) не атомарен. Для потокобезопасной записи требуется внешняя синхронизация или использование java.nio.channels.FileChannel с блокировками.#Java #для_новичков #beginner #IO #NIO #FileOutputStream
👍4
Путь данных от heap до диска
Запись через
Уровень 1: Массив в heap JVM
Java-код подготавливает данные в массиве
Уровень 2: Системный вызов write()
Вызов
Уровень 3: Страничный кэш и dirty pages
Данные не записываются на диск немедленно. Ядро ОС помещает их в страничный кэш, помечая соответствующие страницы как dirty (измененные). Фоновые потоки ядра (pdflush на Linux, buffer cache flush на других системах) периодически синхронизируют dirty pages с блочным устройством. Это называется write-back caching и является стандартной стратегией для файловых систем.
Параметр
Уровень 4: Физическая запись на диск
Контроллер диска (SSD или HDD) получает команды записи от драйвера файловой системы. Для SSD контроллер выполняет wear leveling, распределяя записи равномерно по ячейкам флеш-памяти для продления срока службы. Для HDD головки позиционируются над нужными дорожками. Этот уровень полностью вне контроля JVM и ОС — он управляется прошивкой устройства.
#Java #для_новичков #beginner #IO #NIO #FileOutputStream
Запись через
FileOutputStream проходит через те же уровни памяти, что и чтение, но в обратном направлении:Уровень 1: Массив в heap JVM
Java-код подготавливает данные в массиве
byte[], расположенном в heap. Это обычный объект, управляемый garbage collector.String text = "Hello, World!";
byte[] data = text.getBytes(StandardCharsets.UTF_8);
// data — массив в heap, содержит байты UTF-8: 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21
Уровень 2: Системный вызов write()
Вызов
fos.write(data) инициирует цепочку: нативный метод writeBytes() в FileOutputStream.c вызывает IO_Write, который оборачивает write(fd, buf, len).// Путь данных для write(byte[]):
// 1. byte[] в heap JVM
// 2. Копирование в нативный буфер (JNI transition)
// 3. Системный вызов write() — данные попадают в page cache ядра
// 4. Ядро помечает страницы как dirty (грязные)
// 5. Асинхронная запись dirty-страниц на диск фоновыми потоками ядра
Уровень 3: Страничный кэш и dirty pages
Данные не записываются на диск немедленно. Ядро ОС помещает их в страничный кэш, помечая соответствующие страницы как dirty (измененные). Фоновые потоки ядра (pdflush на Linux, buffer cache flush на других системах) периодически синхронизируют dirty pages с блочным устройством. Это называется write-back caching и является стандартной стратегией для файловых систем.
Параметр
vm.dirty_ratio в Linux определяет, при каком проценте занятой памяти dirty pages начинается агрессивная запись на диск. Параметр vm.dirty_expire_centisecs — через какое время dirty page считается устаревшей и подлежит сбросу.Уровень 4: Физическая запись на диск
Контроллер диска (SSD или HDD) получает команды записи от драйвера файловой системы. Для SSD контроллер выполняет wear leveling, распределяя записи равномерно по ячейкам флеш-памяти для продления срока службы. Для HDD головки позиционируются над нужными дорожками. Этот уровень полностью вне контроля JVM и ОС — он управляется прошивкой устройства.
#Java #для_новичков #beginner #IO #NIO #FileOutputStream
👍4
Роль flush() и fsync()
Метод
Важное различие:
В большинстве сценариев
Пример: запись строки как массива байтов
#Java #для_новичков #beginner #IO #NIO #FileOutputStream
Метод
flush() в FileOutputStream вызывает fd.sync() или аналог, который выполняет системный вызов fsync() на POSIX. Этот вызов гарантирует, что все dirty pages данного файла сброшены на физический носитель, и данные переживут сбой питания.try (FileOutputStream fos = new FileOutputStream("critical.dat")) {
fos.write(transactionData);
fos.flush(); // Сброс буферов JVM в ОС
fos.getFD().sync(); // fsync — гарантия физической записи
} // close() неявно вызывает flush(), но не fsync()Важное различие:
flush() — сброс буферов JVM в page cache ОС. Данные еще не на диске, но видны другим процессам.fsync() (через FileDescriptor.sync()) — принудительная запись dirty pages на физический носитель. Дорогостоящая операция, блокирующая поток до завершения I/O.В большинстве сценариев
flush() достаточно. fsync() применяется только для критичных данных: финансовые транзакции, контрольные точки баз данных, состояния консенсуса в распределенных системах.Пример: запись строки как массива байтов
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class FileWriteExample {
public void writeStringToFile(String path, String content) throws IOException {
// Преобразование строки в байты UTF-8
// Создается новый массив byte[] в heap Eden space
byte[] data = content.getBytes(StandardCharsets.UTF_8);
// FileOutputStream создается в heap
// Нативный fd выделяется ОС, файл открывается или создается
try (FileOutputStream fos = new FileOutputStream(path)) {
// write(byte[]) — копирование из heap в page cache через нативный буфер
fos.write(data);
// Явный flush — гарантия сброса в ОС
// Без flush данные могут оставаться в нативных буферах JVM
fos.flush();
} // close() вызывается автоматически
// 1. flush() — сброс остатков в ОС
// 2. Закрытие файлового дескриптора
// 3. Объект fos становится недостижимым для GC
// Массив data становится недостижимым после выхода из метода
// GC собирает data и fos при следующей minor collection
}
// Режим добавления
public void appendToFile(String path, String content) throws IOException {
byte[] data = (content + System.lineSeparator()).getBytes(StandardCharsets.UTF_8);
// append = true — открытие с O_APPEND, указатель в конце файла
try (FileOutputStream fos = new FileOutputStream(path, true)) {
fos.write(data);
fos.flush();
}
}
}
#Java #для_новичков #beginner #IO #NIO #FileOutputStream
👍4
Роль garbage collector при записи
Жизненный цикл объектов
В этом прице каждая итерация создает временный массив
Оптимизация: переиспользование буфера
Для устранения аллокаций в цикле можно использовать переиспользуемый
Однако этот подход усложняет код без значительного выигрыша для типичных сценариев. JVM эффективно обрабатывает короткоживущие объекты в Eden через TLAB (Thread Local Allocation Buffer), и minor GC для young generation быстр.
#Java #для_новичков #beginner #IO #NIO #FileOutputStream
Жизненный цикл объектов
public void processAndWrite(String outputPath, List<String> records) throws IOException {
// records — ссылка в стеке, объект List в heap, элементы — объекты String в heap
try (BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(outputPath), 8192)) {
for (String record : records) {
// Каждая итерация:
// 1. getBytes() создает новый byte[] в heap Eden
// 2. write() копирует данные в buf BufferedOutputStream (heap)
// 3. При заполнении buf — сброс в FileOutputStream -> ОС
byte[] bytes = record.getBytes(StandardCharsets.UTF_8);
bos.write(bytes);
bos.write('\n');
// bytes становится недостижимым после итерации
// GC собирает bytes в следующей minor collection
}
// bos.flush() сбрасывает остаток buf в ОС
} // bos и underlying fos закрыты
// records все еще достижим, если используется дальше
}В этом прице каждая итерация создает временный массив
bytes. Эти массивы короткоживущие и собираются minor GC в young generation. Если records содержит миллионы элементов, это создает значительное давление на GC, хотя сами массивы малы.Оптимизация: переиспользование буфера
Для устранения аллокаций в цикле можно использовать переиспользуемый
ByteArrayOutputStream или CharsetEncoder с переиспользуемым ByteBuffer:public void optimizedWrite(String outputPath, List<String> records) throws IOException {
// Переиспользуемый буфер в heap, создается один раз
ByteArrayOutputStream baos = new ByteArrayOutputStream(8192);
try (FileOutputStream fos = new FileOutputStream(outputPath);
BufferedOutputStream bos = new BufferedOutputStream(fos)) {
for (String record : records) {
baos.reset(); // Сброс позиции, не создание нового объекта
byte[] bytes = record.getBytes(StandardCharsets.UTF_8);
baos.write(bytes);
baos.write('\n');
// Запись накопленных данных
bos.write(baos.toByteArray(), 0, baos.size());
}
}
}Однако этот подход усложняет код без значительного выигрыша для типичных сценариев. JVM эффективно обрабатывает короткоживущие объекты в Eden через TLAB (Thread Local Allocation Buffer), и minor GC для young generation быстр.
#Java #для_новичков #beginner #IO #NIO #FileOutputStream
👍4
Что выведет код?
#Tasks
import java.io.*;
public class Task050626 {
public static void main(String[] args) throws IOException {
try (FileOutputStream fos = new FileOutputStream("data.bin")) {
fos.write(300);
}
try (FileInputStream fis = new FileInputStream("data.bin")) {
System.out.println(fis.read());
}
}
}
#Tasks
👍3
Что такое striped locks? (ConcurrentHashMap как пример)🤓
Ответ:
Striped locking (блочная блокировка) — техника уменьшения конкуренции, когда разные части данных защищаются разными замками.
Классический пример — ConcurrentHashMap в Java 7: массив сегментов, каждый сегмент — отдельный замок.
В Java 8+ используется более тонкая блокировка на уровне корзин (buckets) с CAS для вставки в пустые корзины и synchronized на узле конкретной корзины при конфликте. Это позволяет параллельно выполнять операции, работающие с разными сегментами/корзинами.
#собеседование
Ответ:
Striped locking
Классический пример — ConcurrentHashMap в Java 7: массив сегментов, каждый сегмент — отдельный замок.
В Java 8+ используется более тонкая блокировка на уровне корзин (buckets) с CAS для вставки в пустые корзины и synchronized на узле конкретной корзины при конфликте. Это позволяет параллельно выполнять операции, работающие с разными сегментами/корзинами.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
247 Java-собесов в банках РФ: 12 вопросов в 80% случаев — и почему №7 валит 9 из 10
Фото: Markus Spiske Обновление (июнь 2026). Цифры в статье — это срез на март 2026 года: 247 разобранных интервью. С тех пор база заметно выросла — сейчас в ней более 1200 переработанных собеседований...
👍4🔥2
История технологии сегодня — 6 июня
ℹ️ Кто родился в этот день
И́горь Ива́нович Сико́рский (англ. Igor Sikorsky, 25 мая (6 июня) 1889[3], Киев, Российская империя — 26 октября 1972, Истон, штат Коннектикут, США) — русский и американский авиаконструктор, учёный, изобретатель, философ. Создатель первых в мире: четырёхмоторного самолёта «Русский витязь» (1913 год), тяжёлого четырёхмоторного бомбардировщика и пассажирского самолёта «Илья Муромец» (1914 год), трансатлантического гидроплана, серийного вертолёта одновинтовой схемы (США, 1942 год).
Джотто Биццаррини (итал. Giotto Bizzarrini; 6 июня 1926, Ливорно, Тоскана — 13 мая 2023, Чечина, Тоскана) — итальянский конструктор автомобилей и инженер-испытатель; создатель одного из наиболее известных автомобилей категории Гран Туризмо — Ferrari 250 GTO; основатель автостроительной компании Bizzarrini (1964—1969).
Карл Фердинанд Браун (нем. Karl Ferdinand Braun; 6 июня 1850, Фульда — 20 апреля 1918, Нью-Йорк) — немецкий физик, лауреат Нобелевской премии по физике в 1909 году (совместно с Г. Маркони). Интенсивно участвовал в разработке технического применения электромагнитных волн. Изобретатель катодной (электронно-лучевой) трубки для исследования электрических колебаний (так называемая «катодная трубка Брауна», или «трубка Брауна»).
🌐 Знаковые события
1761 — М. В. Ломоносов, наблюдая прохождение Венеры по солнечному диску, обнаружил наличие у неё атмосферы.
1882 — Американец Генри Сили (Henry W. Seely) запатентовал электрический утюг.
1979 — запуск советского беспилотного космического корабля «Союз-34» к орбитальной станции «Салют-6».
#Biography #Birth_Date #Events #06июня
И́горь Ива́нович Сико́рский (англ. Igor Sikorsky, 25 мая (6 июня) 1889[3], Киев, Российская империя — 26 октября 1972, Истон, штат Коннектикут, США) — русский и американский авиаконструктор, учёный, изобретатель, философ. Создатель первых в мире: четырёхмоторного самолёта «Русский витязь» (1913 год), тяжёлого четырёхмоторного бомбардировщика и пассажирского самолёта «Илья Муромец» (1914 год), трансатлантического гидроплана, серийного вертолёта одновинтовой схемы (США, 1942 год).
Джотто Биццаррини (итал. Giotto Bizzarrini; 6 июня 1926, Ливорно, Тоскана — 13 мая 2023, Чечина, Тоскана) — итальянский конструктор автомобилей и инженер-испытатель; создатель одного из наиболее известных автомобилей категории Гран Туризмо — Ferrari 250 GTO; основатель автостроительной компании Bizzarrini (1964—1969).
Карл Фердинанд Браун (нем. Karl Ferdinand Braun; 6 июня 1850, Фульда — 20 апреля 1918, Нью-Йорк) — немецкий физик, лауреат Нобелевской премии по физике в 1909 году (совместно с Г. Маркони). Интенсивно участвовал в разработке технического применения электромагнитных волн. Изобретатель катодной (электронно-лучевой) трубки для исследования электрических колебаний (так называемая «катодная трубка Брауна», или «трубка Брауна»).
1761 — М. В. Ломоносов, наблюдая прохождение Венеры по солнечному диску, обнаружил наличие у неё атмосферы.
1882 — Американец Генри Сили (Henry W. Seely) запатентовал электрический утюг.
1979 — запуск советского беспилотного космического корабля «Союз-34» к орбитальной станции «Салют-6».
#Biography #Birth_Date #Events #06июня
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5