Топ-100Синхронизация в Java с помощью Synchronized - CodOrbits
LogoCodOrbits

Раздел: Многопоточность

В этом разделе вы узнаете, как использовать многопоточность в Java для повышения производительности и параллельной обработки.

Все разделы
Иконка Многопоточность

Синхронизация в Java с помощью Synchronized

Last updated: 6 мая 2025 г.

Если несколько параллельных потоков одновременно хотят выполнить один и тот же кусок кода одного и того же объекта, то можно сделать так чтобы они выполняли его поочереди.

То есть они можно сказать выстраиваются в очередь чтобы воспользоваться куском кода в объекте. Смотри пример.

Пример программы:

1public class SynchronizedExample {
2    public static void main(String[] args) {
3        // Объект ресурса (общий для потоков ресурс)
4        CommonResource commonResource = new CommonResource();
5        // Запускаем 5 потоков, передавая в каждый из них 
6        // ресурс, общий для потоков.
7        for (int i = 1; i < 6; i++) {
8            Thread t = new Thread(new CountThread(commonResource));
9            t.setName("Thread " + i);
10            t.start();
11        }
12        // Когда выполнение кода одного из параллельных 
13        // потоков доходит до оператора synchronized, 
14        // доступ к блоку кода synchronized объекта 
15        // ресурса (commonResource) блокируется, и на 
16        // время его блокировки монопольный доступ к 
17        // блоку кода в этом объекте имеет только один 
18        // поток, который дошел до synchronized и который 
19        // произвел блокировку, и все прочие потоки, 
20        // которые используют commonResource будут ждать 
21        // пока поток, который первый дошел до блока 
22        // synchronized, закончит его выполнение.
23    }
24}
25
26class CommonResource {
27    int x;
28    // Когда один из потоков доходит сюда, доступ 
29    // к блоку кода synchronized объекта 
30    // CommonResource блокируется, и другие потоки 
31    // которые дошли до synchronized останавливаются 
32    // и ждут, пока поток, дошедший сюда раньше них, 
33    // выполнит блок synchronized. Когда он все-таки 
34    // выполнил synchronized, в synchronized заходит 
35    // другой поток из очереди, и другие ждут, пока уже 
36    // этот другой поток выполнит код synchronized, 
37    // и так далее со всеми остальными потоками 
38    // в очереди.
39    synchronized void increment() {
40        x = 1;
41        for (int i = 1; i < 5; i++) {
42            System.out.printf("%s %d \n", Thread.currentThread().getName(), x);
43            x++;
44            try {
45                Thread.sleep(700);
46            } catch (InterruptedException e) {}
47        }
48    }
49}
50
51class CountThread implements Runnable {
52    CommonResource res;
53    CountThread(CommonResource res) {
54        this.res = res;
55    }
56    public void run() {
57        res.increment(); // вызываем синхронизированный метод
58    }
59}

Вывод:

Благодаря этому потоки будут работать с ресурсом поочередно и от 1 до 4 сначала выведет первый дошедший до synchronized поток потом второй и так далее. Видим в консоли, что потоки выстроились в очередь в таком порядке – 1 5 2 4 3.


Следующие уроки

Synchronized static в Java

15
мин.

Similar Articles Icon
Divider

Синхронизация с помощью Wait/Notify

9
мин.

Similar Articles Icon
Divider

Метод yield в Java

10
мин.

Similar Articles Icon