💻 Блог о программировании и технологиях:
Resource cleanup, rate‑limiting strategies, bounded vs unbounded channels - в Go vs Java | Паттерны, идиомы и лучшие практики Go
Продолжаем серию статей для разработчиков, которые хотят изучить Go на основе знаний Java, и наоборот. В этой статье мы обсудим три ключевые темы: Resource Cleanup (освобождение ресурсов), Rate-Limiting Strategies (стратегии ограничения нагрузки) и Bounded vs Unbounded Channels (ограниченные и неогр...
Разбираем: Rate‑limiter, non‑blocking operations, scheduler Go vs Java | Concurrency часть 4
Эта статья посвящена пониманию принципов работы с конкурентностью и синхронизацией в Go и Java. Мы рассмотрим ключевые подходы, такие как rate‑limiter, неблокирующие операции и планирование задач, сравним их реализацию и философию в двух языках. Это поможет Java-разработчику быстро освоить Go и, нао...
Разбираем: Trace, Profiling, Integration Testing, Code Coverage, Mocking, Deadlock Detection в Go vs Java | Testing, Debugging и Profiling
Серия: Go для Java-разработчиков — разбор trace, профилирования и тестирования В этой статье мы разберем инструменты и практики для тестирования, отладки и профилирования в Go. Для Java-разработчика это позволит легко ориентироваться в Go, а Go-разработчику — сравнить подходы с Java. Trace — отсл...
Generics, Reflection и каналы - Go vs Java | Types - Language
В этой статье мы разберем продвинутые возможности системы типов в Go: generics (параметры типов), reflection (рефлексию) и типы каналов для работы с конкурентностью. Мы сравним подходы Go и Java, чтобы Java-разработчикам было проще освоить Go, а опытным гоферам — понять, как эти концепции реализован...
Указатели, функции и управление выполнением в Go vs Java | Types - Language
Серия: Go для Java-разработчиков — разбираем pointer, closures, defer, panic/recover В этой статье мы разберем, как Go управляет состоянием и жизненным циклом функций. Особенность Go — лёгкая работа с указателями без сложной арифметики, мощные функции-замыкания и встроенные механизмы для безопасног...
Struct, методы и интерфейсы в Go vs Java | Types - Language
Серия: Go для Java-разработчиков — разбираем struct, interface, receiver types и type embedding В этой статье мы разберем, как в Go строится архитектура типов. Для Java-разработчика это особенно важно, так как Go не использует классы в привычном понимании, а типы и методы организованы иначе. Мы сра...
Разбираем: array, slice, map, zero value - в Go vs Java | Types - Language
Серия: Go для Java-разработчиков Эта статья открывает серию материалов о языке Go для разработчиков, которые уже хорошо знакомы с Java. Мы будем сравнивать подходы двух языков, чтобы быстрее понять, как устроена модель данных Go и почему она выглядит именно так. Зачем вообще разбирать базовые стру...
Разбор Unit testing, Race detector, Benchmarking, Profiling (pprof) Go vs Java | Testing, Debugging и Profiling
1. Unit testing В Go встроенный пакет testing позволяет писать unit-тесты. Для Java-разработчиков это аналог JUnit/TestNG. Unit-тесты в Go просты и встроены в стандартную библиотеку. Для Java привычнее использовать JUnit или TestNG. 2. Race detector Go имеет встроенный -race флаг для выявлени...
Channel direction и select patterns в Go vs Java | Паттерны, идиомы и лучшие практики Go
← Связанные статьи: Context, propagation и cancellation patterns в Go vs Java | Паттерны, идиомы и лучшие практики Go 1. Channel direction — направление каналов В Go каналы могут быть односторонними: только для отправки или получения. Это помогает делать интерфейсы функций более безопасными и я...
Context, propagation и cancellation patterns в Go vs Java | Паттерны, идиомы и лучшие практики Go
← Связанные статьи: Часть 1 — Error handling и defer в Go (Параллельность и синхронизация) | Паттерны, идиомы и лучшие практики Go 1. Context и его роль В Go context.Context используется для передачи сигналов отмены и таймаутов между goroutine, а также для передачи значений (propagation). Для J...
Memory / Runtime / Allocator - Go vs Java
Управление памятью, указатели и профилирование — это фундаментальные аспекты эффективного кода. Рассмотрим три ключевых концепта: slice backing array, pointer и профилирование (pprof / trace), и сравним Go с Java. 1. Slice backing array Слайс в Go — это легкая структура над массивом: хранит указател...
Практические паттерны и оптимизация в Go vs Java | Concurrency часть 3
← Часть 2 — Синхронизация и безопасность в Go В этой части мы рассмотрим практические паттерны параллельной обработки задач: worker pool, pipeline pattern и схемы сборки результатов. Эти паттерны помогают повысить производительность и избегать deadlocks. 1. Worker Pool Worker pool позволяет ...
Синхронизация и безопасность в Go vs Java | Сoncurrency часть 2
← Часть 1 — Основы параллельности в Go для Java-разработчиков Во второй части мы углубимся в синхронизацию и безопасность параллельного кода в Go. Для Java-разработчика полезно видеть аналоги: synchronized, ReentrantLock, CountDownLatch, атомарные операции и схемы работы с потоками. Рассмотри...
Основы параллельности в Go для Java-разработчиков | Сoncurrency часть 1
Если вы Java-разработчик, привыкший к потокам и ExecutorService, Go предлагает более лёгкий и удобный подход к параллельной обработке — goroutine и каналы. В этой статье мы разберём ключевые концепции Go concurrency и сравним их с Java-аналогами. 1. Goroutine vs Thread Goroutine — это лёгкая единица...
Многопоточность в Go и Java: типы задач и паттерны решения
Многопоточность — это не просто «запустить миллион потоков и пусть считают». Это искусство эффективно использовать ресурсы процессора и памяти, безопасно обрабатывать данные и правильно распределять задачи. В Go и Java многопоточность используется для разных целей: ускорение вычислений, работа с в...
Go vs Java - Сравниваем модели памяти - часть 2: atomic operations, preemption, defer/finally, context, escape analysis, GC, false sharing
Atomic operations Atomic операции обеспечивают корректное выполнение операций с переменными без гонок, гарантируя happens-before между чтением и записью. Go пример: import "sync/atomic" var counter int32 func increment() { atomic.AddInt32(&counter, 1) // атомарное увеличение } Java пример: impor...
Go vs Java - сравнение модели памяти: happens-before, visibility, reorder, synchronization events, write/read barriers
Модель памяти — это слой между программой и процессором. Современные CPU агрессивно оптимизируют выполнение: инструкции могут переставляться, данные могут храниться в кешах ядер, а операции могут выполняться спекулятивно. Без строгих правил два потока могли бы видеть совершенно разные значения одной...
Как удержать легаси-проект от смерти и подарить ему ещё 10 лет
Признаки легаси-проекта: как распознать старый корабль Легаси — это не просто старый код. Это живой организм, который пережил десятки изменений, смену команд, устаревшие технологии и множество временных костылей. Он держится на энтузиазме инженеров, на магических знаниях «ветеранов» и на случайных у...
Асинхронность и реактивность в Java: CompletableFuture, Flow и Virtual Threads
В современном Java-разработке есть три основных подхода к асинхронности и параллельности: CompletableFuture — для одиночных асинхронных задач. Flow / Reactive Streams — для потоков данных с контролем скорости (backpressure). Virtual Threads / Loom — для масштабируемой параллельности без блокировок....
Асинхронность в Java: Future, CompletableFuture и Structured Concurrency
Java изначально была ориентирована на многопоточность и параллельные вычисления. Со временем появились разные способы работы с результатами асинхронных задач — от классического Future до современных Structured Concurrency. Разберём основные механизмы, их плюсы, минусы и когда их использовать. 1. Fut...
Полезные статьи:
Привет! С вами Виталий Лесных. Сегодня мы продолжим курс «Основы Java для начинающих» и разберём одну из важнейших тем программирования — циклы. Цикл — это повторение выполнения кода до тех пор, пок...
Java изначально была ориентирована на многопоточность и параллельные вычисления. Со временем появились разные способы работы с результатами асинхронных задач — от классического Future до современных S...
Серия: Go для Java-разработчиков — разбор trace, профилирования и тестирования В этой статье мы разберем инструменты и практики для тестирования, отладки и профилирования в Go. Для Java-разработчика ...
Новые статьи:
Продолжаем серию статей для разработчиков, которые хотят изучить Go на основе знаний Java, и наоборот. В этой статье мы обсудим три ключевые темы: Resource Cleanup (освобождение ресурсов), Rate-Limiti...
Эта статья посвящена пониманию принципов работы с конкурентностью и синхронизацией в Go и Java. Мы рассмотрим ключевые подходы, такие как rate‑limiter, неблокирующие операции и планирование задач, сра...
Серия: Go для Java-разработчиков — разбор trace, профилирования и тестирования В этой статье мы разберем инструменты и практики для тестирования, отладки и профилирования в Go. Для Java-разработчика ...