powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Многопоточность: "производительность" при потокобезопасном создании объекта
12 сообщений из 12, страница 1 из 1
Многопоточность: "производительность" при потокобезопасном создании объекта
    #37978915
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть стандартный механизм потокобезопасного "создания" объекта : double check locking, что то типа того:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
ConcurrentHashMap store;
Object obj = store.get(key);
if (obj==null) {
  synchronized (store) {
   obj = store.get(key)  
   if (obj==null) {
     obj = createObj(key);
     store.put(obj);
   }
  }
return obj;
}




Если предположить, что createObj(key) - может быть долгосрочной операцией, то :
* если потоки запрашивают объект по одному key - все в порядке: каждый поток ожидает store и создания объекта, так и должно быть
* если пришло несколько потоков с разными key, то все они ожидают создания совершенно ненужных им объектов с другими
ключами

Вопрос:
1й вариант:
* синхронизироваться по "ключу", т.е.
- в первом synchronized(store) блоке создаем объект пустышку(Object stub) и кладем его в store
- во втором synchronized(stub) уже запускаем createObj(key);

Со стороны мне он напоминает мой первый велосипед "Эврика". Есть ли какой-то шаблон или правильный ответ на данную задачу, чтобы оптимизировать время ожидания потоков при создании ненужных им объектов?
...
Рейтинг: 0 / 0
Многопоточность: "производительность" при потокобезопасном создании объекта
    #37978938
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если у вас тут действительно много потоков пересекается, то synchronized (store) явно лишняя, конечно же стоит синхронизироваться по ключу. Например использовать Lock, он зачастую удобнее в таких ситуациях.
Многое ещё зависит от того какие у вас там типы вообще используются. key это строка?
...
Рейтинг: 0 / 0
Многопоточность: "производительность" при потокобезопасном создании объекта
    #37978945
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczесли у вас тут действительно много потоков пересекается, то synchronized (store) явно лишняя, конечно же стоит синхронизироваться по ключу. Например использовать Lock, он зачастую удобнее в таких ситуациях.
Многое ещё зависит от того какие у вас там типы вообще используются. key это строка?

Нет, Key - объект с 2мя полями: Class cls, String name
Понятно, что если метод оставить в том виде, в котором я его привел - синхронайзд не подходит.
...
Рейтинг: 0 / 0
Многопоточность: "производительность" при потокобезопасном создании объекта
    #37978949
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так, хотя может тоже велосипед.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
private static class Stub{
	Object getObject(){
		if null...
	}
}

ConcurrentHashMap store;

Object getObject(Object key){
	Stub stub == null;
	if (stub == null)
	 	synchronized (store) {
			stub = store.get(key);
			if (stub == null) {
				stub = new Stub(key);
				store.put( stub );
   			}
	  	}
	return stub.getObject();
}
...
Рейтинг: 0 / 0
Многопоточность: "производительность" при потокобезопасном создании объекта
    #37978952
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос теоретический? В ConcurrentHashMap есть метод putIfAbsent
...
Рейтинг: 0 / 0
Многопоточность: "производительность" при потокобезопасном создании объекта
    #37978957
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите ещё вот здесь, показательный пример с объяснениями
http://dmy999.com/article/34/correct-use-of-concurrenthashmap
если можно объект создать, а потом уже инициализировать, то можно прям этот пример использовать, только блокировать на экземпляре, если инициализация не закончена.
...
Рейтинг: 0 / 0
Многопоточность: "производительность" при потокобезопасном создании объекта
    #37978963
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛагманКак-то так, хотя может тоже велосипед.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
private static class Stub{
	Object getObject(){
		if null...
	}
}

ConcurrentHashMap store;

Object getObject(Object key){
	Stub stub == null;
	if (stub == null)
	 	synchronized (store) {
			stub = store.get(key);
			if (stub == null) {
				stub = new Stub(key);
				store.put( stub );
   			}
	  	}
	return stub.getObject();
}



Нет, создавать объект заранее - нельзя. Не то, чтобы нельзя - по производительности не подходит ;) Таких объектов может быть и 30 и 40, а все это мапы, достаточно тяжеловесные.
...
Рейтинг: 0 / 0
Многопоточность: "производительность" при потокобезопасном создании объекта
    #37978965
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПосмотрите ещё вот здесь, показательный пример с объяснениями
http://dmy999.com/article/34/correct-use-of-concurrenthashmap
если можно объект создать, а потом уже инициализировать, то можно прям этот пример использовать, только блокировать на экземпляре, если инициализация не закончена.

Чето да, lazy инициализация должно быть выход. Спасибо ;)
...
Рейтинг: 0 / 0
Многопоточность: "производительность" при потокобезопасном создании объекта
    #37978969
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинBlazkowiczПосмотрите ещё вот здесь, показательный пример с объяснениями
http://dmy999.com/article/34/correct-use-of-concurrenthashmap
если можно объект создать, а потом уже инициализировать, то можно прям этот пример использовать, только блокировать на экземпляре, если инициализация не закончена.

Чето да, lazy инициализация должно быть выход. Спасибо ;)

ВСмысле, спасибо за мысль ;) Но как бе тема полна велосипедов и мне интересна ;)
...
Рейтинг: 0 / 0
Многопоточность: "производительность" при потокобезопасном создании объекта
    #37978977
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никВопрос теоретический? В ConcurrentHashMap есть метод putIfAbsent

Вопрос - практический.
...
Рейтинг: 0 / 0
Многопоточность: "производительность" при потокобезопасном создании объекта
    #37979009
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинНет, создавать объект заранее - нельзя. Не то, чтобы нельзя - по производительности не подходит ;) Таких объектов может быть и 30 и 40, а все это мапы, достаточно тяжеловесные.
Инстанциируем, лочимся на нём и наполняем. Отсоедините иницализацию от конструктора.
...
Рейтинг: 0 / 0
Многопоточность: "производительность" при потокобезопасном создании объекта
    #37979036
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще обернуть создание объекта в Future.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
private Record getOrCreate(String id) {
    Future<Record> rec = records.get(id);
    if (rec == null) {
        // record does not yet exist
        Future<Record> newRec = new FutureTask(new Callable(){
        ....});
        rec = records.putIfAbsent(id, newRec);
        if (rec == null) {
            // put succeeded, use new value
            rec = newRec;
            rec.run();
        }
    }
    return rec.get();
}
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Многопоточность: "производительность" при потокобезопасном создании объекта
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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