Почему synchronized метод правильно работает только с модификатором static?

Всем доброго дня, прошу прощения за столь, возможно, глупый вопрос. Изучаю тему потоков и в ходе экспериментов выяснил, что при указании метода как synchronized все равно выводится неверный результат. Если же добавить модификатор static к методу, то все работает так, как надо. Но у человека в примере, курс которого изучаю, все работает и без static. В чем моя ошибка?

Вот код класса и метода:

public class Traning {

	public static void main(String[] args) throws InterruptedException {
		MyThread myT1 = new MyThread();
		MyThread myT2 = new MyThread();
		myT1.start();
		myT2.start();
		myT1.join();
		myT2.join();

		System.out.println(MyThread.a);
	}
}

class MyThread extends Thread {
	static int a = 0;

	public void run() {
		for (int i = 0; i < 1000; i++) {
			incrementA();
		}
		System.out.println("myT is ended");
	}
	// Если в данный метод добавить static, то все работает.
	synchronized void incrementA() {
		MyThread.a++;
	}
	
}
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
xez
@xez Куратор тега Java
TL Junior Roo
Дело в том, что synchronized над методом указывает, что объектом синхронизации будет this, у вас этого this два: myT1 и myT2.
Внутри метода производятся операции над переменной static int a, которая только одна.
Получается, что в каждом потоке ничего не блокируется, т.к. каждый поток синхронизируется только сам с собой.

Когда вы добавляете static к методу - this становится одним на уровне всего приложения и потоки, выполняя этот метод сталкиваются с необходимостью синхронизации.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы