C# Singleton thread-safe

J'ai une classe singleton similaire à ce

public class Singleton
{
    private static Singleton m_instance;
    private Timer m_timer;
    private static List<CustomObject> m_cacheObjects;

    private Singleton()
    {    
        m_cacheObjects = new List<CustomObject>();
        m_timer= new Timer(MyTimerCallBack, 
                           null, 
                           TimeSpan.FromSeconds(60), 
                           TimeSpan.FromSeconds(60));           
    }

    public static Singleton Instance
    {
        get
        {
            if (m_instance == null)
            {
                m_instance = new Singleton();
            }
            return m_instance;
        }
    }

    private void MyTimerCallBack(object state)
    {
        //******** Update the list by interval here ******************

        m_cacheObjects = UpdateTheList();
    }

    public void CallMe()
    {
        foreach (CustomObject obj in m_cacheObjects)
        {
            //do something here based on obj

            //The question is, does the m_cacheObjects is thread safe??
            //what happen if the m_cacheObjects is changed
            //during the loop interation?
        }
    }
}

La CallMe méthode sera appelée par le service web:

  [WebMethod]
    public void CallMeWebService()
    {
        Singleton.Instance.CallMe();
    }

Les questions:
1) Est la m_cacheObjects est thread-safe? qu'advient-il si le m_cacheObjects est changé(en raison de la minuterie) au cours de la boucle d'interaction (dans le CallMe() )?

2) Est un nouveau thread est créé lorsque le Webservice CallMeWebService() est appelée?

1)un) N, 1)b) Vous ne pouvez pas être sûr, 2) Oui
Je vais suivre le ci-dessous les réponses pour faire l'initialisation statique d'être thread-safe.
Maintenant j'ai plus de souci à propos de la liste statique m_cacheObjects. Je implicitement pause (mode debug)dans la boucle foreach et attendre que la minuterie à les tiques et modifier le m_cacheObjects liste, on peut supposer que la boucle foreach va échouer en raison de la modification de la liste, mais il continuer la boucle sans exception. Est-ce normal?
Juste pour info avec tous les verrouillage: Si m_cacheObjects est modifié par MyTimerCallBack (j'.e toutes les autres méthodes que l'accès m_cacheObjects sont read-only, ça serait beaucoup plus simple de juste lock m_cacheObjects pendant MyTimerCallBack qui est appelé une fois en une minute, plutôt qu'à plusieurs reprises le verrouillage et le déverrouillage à chaque fois que quelqu'un appelle la read-only méthodes. Au meilleur de ma connaissance, le verrouillage de lecture n'est pas indispensable, que lorsque l'état de la collection pourrait changer.

OriginalL'auteur user1553857 | 2012-07-26