Найти в Дзене
DEBAGanov

Java 477. Что вы подразумеваете под синхронизацией? Объясните на примере?

Синхронизация в Java используется для контроля доступа к общим ресурсам из нескольких потоков. Она позволяет избежать состояния гонки, при котором несколько потоков пытаются получить доступ к одному и тому же ресурсу одновременно, что может привести к непредсказуемым результатам. Синхронизация в Java достигается с помощью механизма блокировки. В Java каждый объект имеет свой монитор (или блокировку), который можно использовать для синхронизации доступа к этому объекту из нескольких потоков. Когда поток заходит в блок synchronized (синхронизированный блок) связанный с определенным объектом, он получает монитор этого объекта и удерживает его до тех пор, пока не выйдет из блока synchronized. Вот пример кода на Java, который демонстрирует синхронизацию: public class Main {
public static void main(String[] args) {
SharedResource sharedResource = new SharedResource();
Thread thread1 = new Thread(new MyRunnable(sharedResource));
Thread thread2 = new Thread(new My

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

Синхронизация в Java достигается с помощью механизма блокировки. В Java каждый объект имеет свой монитор (или блокировку), который можно использовать для синхронизации доступа к этому объекту из нескольких потоков. Когда поток заходит в блок synchronized (синхронизированный блок) связанный с определенным объектом, он получает монитор этого объекта и удерживает его до тех пор, пока не выйдет из блока synchronized.

Вот пример кода на Java, который демонстрирует синхронизацию:

public class Main {
public static void main(String[] args) {
SharedResource sharedResource = new SharedResource();
Thread thread1 = new Thread(new MyRunnable(sharedResource));
Thread thread2 = new Thread(new MyRunnable(sharedResource));
thread1.start();
thread2.start();
}
}

class SharedResource {
private int counter = 0;

public synchronized void incrementCounter() {
// Синхронизированный метод
counter++;
System.out.println("Counter value: " + counter);
}
}

class MyRunnable implements Runnable {
private SharedResource sharedResource;

public MyRunnable(SharedResource sharedResource) {
this.sharedResource = sharedResource;
}

public void run() {
for (int i = 0; i < 5; i++) {
sharedResource.incrementCounter();
}
}
}

В этом примере мы создаем два потока исполнения, которые будут использовать общий объект sharedResource. Объект sharedResource содержит синхронизированный метод incrementCounter(), который увеличивает счетчик и выводит его значение на экран.

При выполнении метода incrementCounter() поток получает монитор sharedResource и удерживает его до тех пор, пока не выйдет из метода. Это означает, что другой поток не сможет получить доступ к методу incrementCounter() в тот же самый момент времени, пока первый поток удерживает монитор.

Если запустить эту программу, то ее результат будет похожим на следующий:

Counter value: 1
Counter value: 2
Counter value: 3
Counter value: 4
Counter value: 5
Counter value: 6
Counter value: 7
Counter value: 8
Counter value: 9
Counter value: 10

Как видно из результата, значения счетчика выводятся последовательно, так как каждый поток получает монитор объекта sharedResource перед выполнением метода incrementCounter(). Без синхронизации, значения счетчика могут выводиться непредсказуемым образом, так как два потока могут попытаться увеличить его одновременно.

1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions

Tелеграмм канал: https://t.me/DEBAGanov

Мое резюме: https://github.com/DEBAGanov