---
title: Синхронизация и состояния потоков
seo:
  title: Синхронизация и состояния потоков — Java Developer
  description: Тема «Синхронизация и состояния потоков» для собеседования Java Developer. Дайте определение понятию «синхронизация». Какие существуют способы синхронизации в Java?
---

[Все темы Java Developer](/java-developer)

## <strong>Дайте определение понятию «синхронизация».</strong> [#q-14bee738d69b810e8cd1de8228417a4b]

Синхронизация в программировании — это механизм, обеспечивающий правильное выполнение потоков при одновременном доступе к общим ресурсам. Она предотвращает состояние гонки и обеспечивает согласованность данных, синхронизируя доступ к критическим секциям кода.

<strong>Пример&#58;</strong>

```java
public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}
```

В этом примере методы <code>increment</code> и <code>getCount</code> синхронизированы, что гарантирует корректный доступ к переменной <code>count</code> из нескольких потоков.

:::note[Ссылки для изучения]

1. [Многопоточность в Java](https://javarush.com/groups/posts/1992-mnogopotochnostjh-v-java-sutjh-pljusih-i-chastihe-lovushki-)
   :::

---

## <strong>Какие существуют способы синхронизации в Java?</strong> [#q-14bee738d69b8136a4bcebedb29983b4]

<strong>Способы синхронизации в Java&#58;</strong>

{/* prettier-ignore */}
1. <strong>Ключевое слово</strong> <code>synchronized</code><strong>&#58;</strong>

    - Синхронизация методов&#58;

        ```java
        public synchronized void method() {
            // код
        }
        ```

    - Синхронизация блоков&#58;

        ```java
        public void method() {
            synchronized (this) {
                // код
            }
        }
        ```

1. <strong>Объект</strong> <code>Lock</code> <strong>из</strong> <code>java&#46;util&#46;concurrent&#46;locks</code><strong>&#58;</strong>

    - Реализация блокировок с расширенными возможностями.

    - Пример&#58;

        ```java
        import java.util.concurrent.locks.Lock;
        import java.util.concurrent.locks.ReentrantLock;

        private final Lock lock = new ReentrantLock();

        public void method() {
            lock.lock();
            try {
                // код
            } finally {
                lock.unlock();
            }
        }
        ```

1. <strong>Классы из</strong> <code>java&#46;util&#46;concurrent</code><strong>&#58;</strong>

    - <code>ReentrantLock</code>, <code>ReadWriteLock</code>, <code>StampedLock</code> для расширенной синхронизации.

    - Пример использования <code>ReadWriteLock</code>&#58;

        ```java
        import java.util.concurrent.locks.ReentrantReadWriteLock;
        import java.util.concurrent.locks.ReadWriteLock;

        private final ReadWriteLock rwLock = new ReentrantReadWriteLock();

        public void readMethod() {
            rwLock.readLock().lock();
            try {
                // код для чтения
            } finally {
                rwLock.readLock().unlock();
            }
        }

        public void writeMethod() {
            rwLock.writeLock().lock();
            try {
                // код для записи
            } finally {
                rwLock.writeLock().unlock();
            }
        }
        ```

1. <strong>Атомарные переменные&#58;</strong>

    - Классы из <code>java&#46;util&#46;concurrent&#46;atomic</code>, обеспечивающие атомарные операции.

    - Пример&#58;

        ```java
        import java.util.concurrent.atomic.AtomicInteger;

        private final AtomicInteger count = new AtomicInteger(0);

        public void increment() {
            count.incrementAndGet();
        }
        ```

1. <strong>Синхронизированные коллекции&#58;</strong>

    - Коллекции из <code>java&#46;util&#46;Collections&#46;synchronizedList</code>, <code>synchronizedMap</code>.

    - Пример&#58;

        ```java
        import java.util.Collections;
        import java.util.List;
        import java.util.ArrayList;

        List<String> syncList = Collections.synchronizedList(new ArrayList<>());
        ```

:::note[Ссылки для изучения]

1. [Многопоточность в Java](https://javarush.com/groups/posts/1992-mnogopotochnostjh-v-java-sutjh-pljusih-i-chastihe-lovushki-)
   :::

---

## <strong>В каких состояниях может находиться поток?</strong> [#q-14bee738d69b8105abaaf73d15b97c1a]

<strong>Состояния потока в Java&#58;</strong>

{/* prettier-ignore */}
1. <strong>NEW (новый)&#58;</strong>

    - Поток создан, но ещё не запущен.

    - Пример&#58; <code>Thread thread &#61; new Thread&#40;&#41;&#59;</code>

1. <strong>RUNNABLE (работающий)&#58;</strong>

    - Поток запущен и готов к выполнению.

    - Пример&#58; <code>thread&#46;start&#40;&#41;&#59;</code>

1. <strong>BLOCKED (заблокированный)&#58;</strong>

    - Поток ожидает освобождения монитора, чтобы войти в синхронизированный блок/метод.

    - Пример&#58; <code>synchronized &#40;obj&#41; &#123; &#47;&#42; код &#42;&#47; &#125;</code>

1. <strong>WAITING (ожидание)&#58;</strong>

    - Поток ожидает другого потока для выполнения определённого действия (например, вызова <code>notify&#40;&#41;</code> или <code>notifyAll&#40;&#41;</code>).

    - Пример&#58; <code>obj&#46;wait&#40;&#41;&#59;</code>

1. <strong>TIMED\_WAITING (ожидание с таймаутом)&#58;</strong>

    - Поток ожидает определённый период времени.

    - Пример&#58; <code>Thread&#46;sleep&#40;1000&#41;&#59;</code> или <code>obj&#46;wait&#40;1000&#41;&#59;</code>

1. <strong>TERMINATED (завершённый)&#58;</strong>

    - Поток завершил выполнение.

    - Пример&#58; Метод <code>run&#40;&#41;</code> завершил выполнение.

:::note[Ссылки для изучения]

1. [Многопоточность в Java](https://javarush.com/groups/posts/1992-mnogopotochnostjh-v-java-sutjh-pljusih-i-chastihe-lovushki-)
   :::

---

## <strong>Как работают методы</strong> <code>wait&#40;&#41;</code> <strong>и</strong> <code>notify&#40;&#41;</code><strong>/</strong><code>notifyAll&#40;&#41;</code><strong>?</strong> [#q-14bee738d69b81e9925aef53c8b65d98]

<strong>Методы</strong> <code>wait&#40;&#41;</code>
<strong>,</strong> <code>notify&#40;&#41;</code>
<strong>,</strong> <code>notifyA</code>
<strong>&#58;</strong>

{/* prettier-ignore */}
- <code>wait&#40;&#41;</code><strong>&#58;</strong>

    - wait() освобождает монитор данного объекта и ожидает уведомления, прерывания или ложного пробуждения; вариант с таймаутом также ограничивает ожидание. Перед возвратом поток снова захватывает монитор. Условие проверяют в цикле while, а не считают само пробуждение доказательством готовности.

    - Вызывается на объекте внутри синхронизированного блока.

    - Пример&#58;

        ```java
        synchronized (obj) {
            obj.wait();
        }
        ```

- <code>notify&#40;&#41;</code><strong>&#58;</strong>

    - Пробуждает один из потоков, ожидающих на этом объекте.

    - Поток переходит из состояния WAITING в состояние BLOCKED.

    - Пример&#58;

        ```java
        synchronized (obj) {
            obj.notify();
        }
        ```

- <code>notifyAll&#40;&#41;</code><strong>&#58;</strong>

    - Пробуждает все потоки, ожидающие на этом объекте.

    - Все пробужденные потоки переходят в состояние BLOCKED.

    - Пример&#58;

        ```java
        synchronized (obj) {
            obj.notifyAll();
        }
        ```

:::note[Ссылки для изучения]

1. [Многопоточность в Java](https://javarush.com/groups/posts/1992-mnogopotochnostjh-v-java-sutjh-pljusih-i-chastihe-lovushki-)
   :::

---

## <strong>Что такое</strong> <code>deadlock</code><strong>?</strong> [#q-14bee738d69b8133bb48dc24e6a8c136]

<code>Deadlock</code> — это ситуация, когда два или более потоков навсегда
блокируют друг друга, ожидая освобождения ресурсов, захваченных другими
потоками.

#### Ситуация&#58;

1. Поток 1 захватывает ресурс A и ожидает ресурс B.

1. Поток 2 захватывает ресурс B и ожидает ресурс A.

Оба потока блокируют друг друга, и выполнение программы останавливается.

#### Пример&#58;

```java
public class DeadlockExample {
    private final Object resourceA = new Object();
    private final Object resourceB = new Object();

    public void method1() {
        synchronized (resourceA) {
            synchronized (resourceB) {
                // код
            }
        }
    }

    public void method2() {
        synchronized (resourceB) {
            synchronized (resourceA) {
                // код
            }
        }
    }
}
```

В этом примере, если <code>method1</code> и <code>method2</code> вызываются одновременно в разных потоках, может произойти взаимная блокировка.

:::note[Ссылки для изучения]

1. [Многопоточность в Java](https://javarush.com/groups/posts/1992-mnogopotochnostjh-v-java-sutjh-pljusih-i-chastihe-lovushki-)
   :::
