2014-12-20 3 views
1

Я понимаю, что в Spring Framework по умолчанию для компонента bean используется Singleton. Это означает, что в контейнере создается только один экземпляр компонента.Singleton класс или экземпляр в java

Но я не могу понять практически ниже сценария.

Например, класс class OneConClass сконфигурирован как singleton bean в контексте spring.xml, 1) для каждого запроса запроса для этого класса он использует тот же экземпляр. Если да, то если я позвоню, как new SingleTonClass().sum(3,4) из другого класса и new SingleTonClass().sum(5,6), вернет мне результаты правильно или будет проблема несколько раз?

2) если один и тот же экземпляр используется всеми запросами, как это возможно за кулисами, что использование всего одного экземпляра используется всеми запросами? если есть 100 запросов к одному и тому же одноэлементному классу, каждый запрос должен ждать завершения предыдущего запроса?

Edit:

Пусть говорят, я использую @Autowired и не новый оператор

В моем главном классе, я пытаюсь использовать компонент настроен с помощью пружины. Пусть говорят, если MyMain вызывается несколько раз (может или не может быть одновременных вызовов), я хочу, чтобы понять точку 2 в моем посте выше (редактировать)

public class MyMain() { 

@Autowired 
SingleTonClass singleTonClass; 

} 




    public class SingleTonClass { 

    private int a=0; 
    private int b=0; 

    public int sum(int a ,int b) { 

    return a+b; 
    } 
    } 
+0

На самом деле, этот конкретный пример выглядит лучше было бы для статического метода, а не класс синглтона. Тем не менее, я уверен, что это потому, что вы никогда не используете конструктор, а только такой метод, как 'SingletonClass.getInstance()', который возвращает singleton. –

+1

Я предполагаю, что при настройке компонента в качестве одноэлементного кода в фреймворке вам нужно получить экземпляр из контекста приложения, иначе он будет просто другим классом с несколькими экземплярами. – BatScream

+0

См. Http://stackoverflow.com/questions/11189907/thread-safe-stateless-design-using-spring – kamoor

ответ

1

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

2) Если у вас есть 100 одновременных запросов, тогда будет 100 потоков, и все они могут одновременно вызвать ваш класс без блокировки. Тем не менее, вы можете заставить потоки ждать друг друга (например, используя synchronized или любой класс Lock). Естественно, производительность будет страдать, так как теперь у вас есть ситуация, когда ждут 99 потоков. Единственная причина, почему вы предпочли бы такое решение, - это то, что ваш компонент имеет общее, изменяемое состояние, и это то, о чем я советую. Вдоль этих строк вы можете удалить переменные экземпляра a и b из вашего примера. В конце концов, они не были использованы в любом случае, так как a и b были переданы в качестве аргументов методы:

public class SingleTonClass { 

    public int sum(int a ,int b) { 
     return a+b; 
    } 
} 
+0

спасибо mastsev за ваш ответ – user3426143

1

Когда вы делаете new SingleTonClass() вы всегда получите новую копию класса. Чтобы использовать функцию Spring instancing, вы должны позволить Spring сделать вашу конфигурацию для вас, например, используя аннотацию @Autowired.

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

+0

спасибо user3120173. Большинство ваших ответов помогли мне, но я могу только принять их. – user3426143

1

Вам необходимо написать фаны без гражданства (значит, в bean-компоненте не должно быть никакого хранилища данных), чтобы не беспокоиться о безопасности потоков. Или вам нужно самостоятельно управлять поточной безопасностью. Spring по умолчанию создает однопользовательские потоковые безопасные экземпляры класса. Даже «прототип» не является потокобезопасным. Когда вы определяете область действия как прототип, это просто означает, что весна будет создавать новый экземпляр каждый раз, когда он вводит в другой компонент, а не то, что экземпляр создается каждый раз при выполнении этого компонента.

Например, класс А, введенный в два компонента в виде bean-компонентов a1 и a2. В SpringContext будет только два экземпляра, даже если миллионы запросов обслуживаются этими компонентами.

См. Это question, чтобы узнать больше о различных стратегиях дизайна, за которыми вы можете следовать.

Кстати, я не вижу необходимости в приватном объявлении int a, b на уровне класса в вашем примере. На самом деле он даже не используется, и, следовательно, этот компонент является потокобезопасным.

+0

спасибо kamoor1982 – user3426143

Смежные вопросы