Spring Injection - Резьба безопасна - PullRequest
4 голосов
/ 15 февраля 2011
public class Test{
private First first;
private Second second;

public void setFirst(First first){
this.first = first;
}
public First getFirst(){
 return first;
}
// same approach for second
}

Если я впрыскиваю экземпляр с помощью пружинного впрыска, это потокобезопасно?Если нет, то как сделать потокобезопасным?Я погуглил и обнаружил противоречивые ответы, не в состоянии прийти к какому-либо выводу. Пожалуйста, предложите.Заранее спасибо.-RW

Ответы [ 3 ]

7 голосов
/ 15 февраля 2011

Если вы говорите о том, о чем, я думаю, вы говорите, то это интересная дискуссия.

Технически , потому что setFirst() и getFirst() не synchronized, тогда возможно для setFirst() для внедрения одного объекта в Потоке 1 и getFirst() для возврата другого объекта в Потоке 2. Модель памяти Java оставляет за собой право сделать это "в конечном итоге непротиворечивым"как говорится.

Так что в случае Spring, который настраивает свой граф бинов во время запуска (или внутренний поток запуска сервера), возможно, что потоки HTTP-запроса (например) не увидят этот бинГрафик правильно, из-за отсутствия синхронизации.

Примечание: это не имеет ничего общего с одновременным доступом.Даже если HTTP-запросы приходят после инициализации Spring, модель памяти Java не гарантирует, что эти потоки будут видеть правильные данные.

На практике этого никогда не происходит (по крайней мере, я никогда не видел этобывает).Отсутствие синхронизации действительно является проблемой только для параллельных потоков, что не является проблемой здесь.

Так что это действительно академический аргумент.

Если это не что вы говорите, мои извинения.Это все еще интересная мысль.

0 голосов
/ 24 июня 2011

Внедрение зависимостей выполняется Spring, вам не нужно заботиться о безопасности потоков геттеров и сеттеров, потому что Spring собирается внедрить зависимости, учитывая, что у вас нет логики синхронизации.

Кроме того, ни один другой поток (то есть потоки вашего приложения) не будет использовать компоненты, пока контекст не будет полностью настроен и все зависимости не будут введены.

Вам не следует беспокоиться о безопасности потоков при внедрении зависимостей, что делает Spring (скорее всего, Spring будет использовать только один поток для внедрения всех зависимостей).

0 голосов
/ 15 февраля 2011

Предполагается, что вы создали одноэлементный экземпляр Test и пытаетесь установить / получить значение (a) из Spring (b) из другой части вашей программы.В этом случае просто сделайте синхронизацию пары get / set:

public synchronized void setFirst(First first){
    this.first = first;
}
public synchronized First getFirst(){
    return first;
}

Я не вижу другой защиты от многопоточности

...