Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Выбор объекта для synchronyzed(...) / 9 сообщений из 9, страница 1 из 1
15.10.2014, 17:55
    #38777823
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор объекта для synchronyzed(...)
Вот упрощенный кусок кода:
Код: 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
16.10.2014, 14:59
    #38778720
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор объекта для synchronyzed(...)
Может у вас ссылка на taskSet где-то утекает. Какие ещё методы у этого класса?
...
Рейтинг: 0 / 0
16.10.2014, 16:45
    #38778884
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор объекта для synchronyzed(...)
Blazkowicz,

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

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

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

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

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

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

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

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


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