Являются ли запросы данных по умолчанию синхронными в Java?

«Являются ли запросы данных по умолчанию синхронными в Java?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, большинство стандартных API ввода-вывода (I/O) и сетевых вызовов в Java являются синхронными и блокирующими. Выполняющий их поток блокируется до завершения операции.

Пример синхронного HTTP-запроса (Java 11+):

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://api.example.com/data"))
        .build();
// Синхронный вызов — поток блокируется
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

Асинхронные альтернативы:

  1. CompletableFuture (Java 8+):
    CompletableFuture<HttpResponse<String>> future =
        client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
    future.thenAccept(resp -> System.out.println(resp.body())); // Неблокирующая обработка
  2. Реактивные стеки: Spring WebFlux, Project Reactor используют неблокирующие клиенты и обрабатывают запросы асинхронно на основе событийного цикла (event loop).

Выбор подхода зависит от требований к масштабируемости и пропускной способности приложения.