powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Выбор объекта для synchronyzed(...)
9 сообщений из 9, страница 1 из 1
Выбор объекта для synchronyzed(...)
    #38777823
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот упрощенный кусок кода:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
class TaskExecutor {
	final Object lockObject = new Object();
	final Set taskSet = Collections.synchronizedSet(new HashSet<Key>());
	
	void startTask(Key key) {
		synchronized(taskSet) {
			if (!taskSet.contains(key)) {
				executorService.submit(new Task(key));
	
				taskSet.add(key);
				activeTaskCountSemaphore.acquire();
	
			} else {
				throw new TaskException("Задача с данным ключем уже активна");
			}
		}
	}
	
	void onTaskComplete(Key key) {
		synchronized(taskSet) {
			taskSet.remove(key);
			activeTaskCountSemaphore.release();
		}
	}
}



Методы класса вызываются из разных потоков.
В данном варианте работает корректно, но если вместо synchronized(taskSet) везде поставить synchronized(lockObject), то работать будет по другому (некорректно).
Может кто кратко объяснить почему так происходит? Если для всех блоков синхронизации используется один и тот же объект, зависит ли выполнение от того, что это за объект?
...
Рейтинг: 0 / 0
Выбор объекта для synchronyzed(...)
    #38778720
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может у вас ссылка на taskSet где-то утекает. Какие ещё методы у этого класса?
...
Рейтинг: 0 / 0
Выбор объекта для synchronyzed(...)
    #38778884
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

taskSet используется только в этих методах и только внутри synchronized. Единственное исключение:
Код: java
1.
2.
3.
	public int getActiveTaskCount() {
		return taskSet.size();
	}
...
Рейтинг: 0 / 0
Выбор объекта для synchronyzed(...)
    #38778924
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
publexus,

А если этот метод тоже синхронизировать по lockObject ?
...
Рейтинг: 0 / 0
Выбор объекта для synchronyzed(...)
    #38779637
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczpublexus,

А если этот метод тоже синхронизировать по lockObject ?

Результат тот же.
...
Рейтинг: 0 / 0
Выбор объекта для synchronyzed(...)
    #38779651
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
publexus,

Простите, а что значит некорректно?
...
Рейтинг: 0 / 0
Выбор объекта для synchronyzed(...)
    #38780002
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевpublexus,

Простите, а что значит некорректно?

Изменением всего лишь объекта блокировки, потоки задач либо выполнялись до конца, либо самопроизвольно завершались.
Смотрите тему по поводу завершения потоков тут .
...
Рейтинг: 0 / 0
Выбор объекта для synchronyzed(...)
    #38780008
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
publexusИзменением всего лишь объекта блокировки, потоки задач либо выполнялись до конца, либо самопроизвольно завершались. Смотрите тему по поводу завершения потоков тут .
Вы сильно путаете потоки и задачи. Thread это поток. Callable/Runnable это не поток.
...
Рейтинг: 0 / 0
Выбор объекта для synchronyzed(...)
    #38780092
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczВы сильно путаете потоки и задачи. Thread это поток. Callable/Runnable это не поток.

Я запускал задачи отдельными потоками через Executors.newCachedThreadPool().
После исправления по вашему совету нормально заработало при разных объектах блокировки. Как это взаимосвязано - я пока не понимаю.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Выбор объекта для synchronyzed(...)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]