Как добиться синхронизации потоков, не влияя на эффективность в Java - PullRequest
2 голосов
/ 12 января 2012

Скажите, используя следующую функцию:

getUnique(){
    MyObject obj = getValueFromDb();
    obj.modifyIt();
    obj.commit();
}

При одновременном вызове этого метода несколько потоков разделяют одно и то же значение MyObject, но я ожидал, что каждый поток будет иметь уникальное значение.

Чтобы исправить это, я использовал синхронизацию потоков, используя class.getInstance().myMethodCall(), чтобы получить уникальное значение некоторого свойства, это решило задачу, но при одновременном вызове снижает эффективность функции.

Есть ли лучший способ это исправить? (С использованием STRUTS, HIBERNATE3.0)

Ответы [ 3 ]

4 голосов
/ 12 января 2012

В Hibernate каждый поток имеет свой собственный сеанс, а каждый сеанс имеет свой набор объектов.Таким образом, каждый поток будет иметь свою собственную копию MyObject.База данных будет обрабатывать параллельные изменения для вас.Если вы хотите запретить двум потокам изменять один и тот же объект одновременно, используйте оптимистичный параллелизм с полем @Version, как описано в документации по Hibernate.

Синхронизация здесь не тот инструмент, потому что, если ваше приложение кластеризовано или объект изменен другим приложением или даже другим методом, синхронизация не будет иметь никакого эффекта.

1 голос
/ 12 января 2012

Ваше предположение, что «несколько потоков имеют одинаковое значение MyObject», неверно.MyObject не является переменной экземпляра, поэтому он не будет использоваться совместно с другими потоками.

0 голосов
/ 12 января 2012

Я хотел бы сказать вам две вещи, во-первых, как указано @Umesh, каждый поток имеет свою собственную копию MyObject, они не разделяют копию

, а во-вторых, функцию getValueFromDb ()также является внешним, вы гарантировали, что getValueFromDb () также синхронизируется.если не?тогда вы должны синхронизировать это тоже.

Кроме того, что находится внутри myMethodCall () ???Возвращает ли оно то же значение, которое возвращает getValueFromDb () ??

...