2014-11-18 2 views
0

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

Я видел много веб-приложений и веб-сервисов, которые реализуют шаблон дизайна Singleton, но в последнее время я думал, что нет реальной причины, почему это должна быть хорошая идея (дайте мне знать, если я неправильный)

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

Ex: Request 1 Calls MethodInStaticInstance() Предположим, что требуется 2 секунды. Request 2 Calls MethodInStaticInstance() Ожидает, что запрос 1 будет выполнен, чтобы вызвать метод, потому что он был использован. (Возможно, я ошибаюсь, так я это вижу, я не знаю, верно это или нет)

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

+0

Конечно, их можно использовать асинхронно с возможностью условий гонки и другими проблемами. Отдельными потоками, конечно же, –

ответ

0

Нет никаких особых сведений об static экземплярах, их методы выполняются в той же теме, что и их вызывающий.

Нет, статические экземпляры не используются «асинхронно», если их вызывающие пользователи не находятся в отдельных потоках.

В контексте веб-приложения существует реальная возможность условия гонки, если два пользователя одновременно используют одну и ту же функцию, если метод не является потокобезопасным.

0

Статики полезны, когда вы не хотите создавать экземпляр объекта для запуска метода. Рассмотрим следующий пример:

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

Чтобы получить сумму, которую вы должны были бы сделать следующее:

MyMath m = new MyMath(); 
    int c = m.sum(1, 2); 

Однако, если sum были статичными вы могли бы сделать следующее и избежать нежелательного создания объекта:

int c = MyMath.sum(1,2); 

Теперь, что касается использования асинхронно: нет причин, по которым вы не можете. Это не более или менее безопасный поток, чем нестатический класс (хотя с нестационарными классами вы можете использовать отдельные экземпляры в отдельных потоках, если хотите).

EDIT: Singleton

синглтон, как правило, используется, когда вы хотите, чтобы гарантировать, что только один конкретизации объекта происходит. Причины разные, для того, чтобы это сделать. Я использовал его в прошлом, чтобы ограничить количество подключений к ресурсу. Можете ли вы использовать это асинхронно или нет, зависит от вашей реализации. Вы можете реализовать блокировки для предотвращения одновременного запуска нескольких вызовов метода, но вам нужно будет это сделать.

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