2013-11-27 4 views
-1

В C# я хочу реализовать Singletons для предоставления данных в одном потоке для многих других потоков.Рабочий пример Singleton

Я решил использовать эту ленивую форму Singleton от Jon тарелочкам (спасибо, Джон!):

public sealed class Singleton 
{ 
    Singleton() 
    { 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      return Nested.instance; 
     } 
    } 

    class Nested 
    { 
     // Explicit static constructor to tell C# compiler 
     // not to mark type as beforefieldinit 
     static Nested() 
     { 
     } 

     internal static readonly Singleton instance = new Singleton(); 
    } 
} 

До сих пор, так хорошо. ... но как это можно использовать?

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

public bool myboolean = false ; 
public double mydoubles[] = new double[128,3] ; 
public IntPtr myhandles[] = new IntPtr[128] ; 

Как декларировать и ссылаться на эти данные, как Одиночки?

Мне также нужны, чтобы они были ссылочными в разных пространствах имен.

Большое спасибо!

+0

1) Если вы хотите создать синглтон, зачем использовать это слишком подробный синтаксис. Статья Джона дает синтаксис, который короче и одинаково эффективен. 2) Вы почти наверняка не хотите делать это вообще; попытка доступа к этим объектам из разных потоков, вероятно, приведет к небезопасному коду, заполненному условиями гонки. – Servy

+0

ли это версия, которую вы имели в виду: \t общественного запечатанный класс Singleton \t { \t \t частный статический экземпляр Синглтон только для чтения = новый Синглтон(); \t \t статическая Синглтон() \t \t { \t \t} \t \t частный Синглтон() \t \t { \t \t} \t \t общественности статической Синглтон экземпляра \t \t { \t \t \t GE т \t \t \t { \t \t \t \t возврата экземпляра; \t \t \t} \t \t} \t} Я счастлив сделать это, но мое главное требование иметь уникальный экземпляр данных я упоминал выше, доступны для нескольких потоков. Если вы можете предложить хороший и эффективный способ (с кодированным примером) сделать это, я был бы очень благодарен. Благодаря! – jeronymite

+0

FYI, я также ограничен .NET 3.5 в это время. Благодаря! – jeronymite

ответ

0
// thread-safety 
    public sealed class Singleton 
    { 
     private static Singleton instance = null; 
     private static readonly object padlock = new object(); 

     private bool myboolean = false; 
     private double[,] mydoubles = new double[128, 3]; 
     private IntPtr[] myhandles = new IntPtr[128]; 

     Singleton() 
     { 
     } 

     public static Singleton Instance 
     { 
      get 
      { 
       lock (padlock) 
       { 
        if (instance == null) 
        { 
         instance = new Singleton(); 
        } 
        return instance; 
       } 
      } 
     } 
    } 

и получить доступ к

 //Singleton.Instance.myboolean 
     //Singleton.Instance.mydoubles 
     //Singleton.Instance.myhandles 
+0

Большое спасибо! В настоящее время я тестирую его и дам вам знать, как это происходит. Очень ценю ваш совет. – jeronymite

+0

Это, кажется, работает достаточно хорошо. Благодарю. Тем не менее, можно ли проверить, был ли экземпляр создан другим потоком, например, используя сравнение с нулем, чтобы избежать его фактического экземпляра? Мои тесты, похоже, указывают на то, что это не так.С другой стороны, существует ли способ гарантировать, что экземпляр создается только определенным потоком ... что, вероятно, означает явное создание, а не ленивое? – jeronymite

+0

Или можно каким-либо образом распорядиться экземпляром, чтобы разрешить создание другого? – jeronymite

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