Синхронизация в 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
мин.
Синхронизация с помощью Wait/Notify
9
мин.
Метод yield в Java
10
мин.