2010-08-17 3 views
1

J'ai une classe CacheHelper pour faciliter l'interaction avec le cache. Je veux utiliser un champ static int pour spécifier le délai d'attente de mon cache. Le champ est initialement défini sur une valeur par défaut const, mais je souhaite fournir à l'application un moyen de modifier la valeur de délai d'attente par défaut.Verrouillage pour modifier le membre du type de valeur statique. Est-ce nécessaire?

Avez-vous besoin de verrouiller lors de la modification d'un type de valeur statique? Le verrouillage du setter est-il nécessaire? Y a-t-il d'autres problèmes que vous pouvez voir ici? Désolé, je suis encore assez stupide quand il s'agit de multithreading.

Merci.

public static class CacheHelper 
{ 
    private static object _SyncRoot; 
    private static int _TimeoutInMinutes = CacheDefaults.TimeoutInMinutes; 

    public static int TimeoutInMinutes 
    { 
     get 
     { 
      return _TimeoutInMinutes; 
     } 
     set 
     { 
      lock (_SyncRoot) 
      { 
       if (_TimeoutInMinutes != value) 
       { 
        _TimeoutInMinutes = value; 
       } 
      } 
     } 
    } 

    public static void Insert(string key, Object data) 
    { 
     if (HttpContext.Current != null && data != null) 
     { 
      HttpContext.Current.Cache.Insert(key, data, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(CacheHelper.TimeoutInMinutes)); 
     } 
    } 
} 

Répondre

2

Vous pouvez utiliser une variable volatile à la place ... mais vous avez besoin quelque chose, sinon il est possible qu'une valeur écrite par un fil ne serait jamais vu par un autre.

Notez que pour les « grands » types tels que double ou long vous vraiment devez utiliser une serrure ou la classe Interlocked, que les modifications à ces valeurs peuvent ne pas être atomique.

+0

Est-il acceptable de combiner l'utilisation de volatile et un verrou? La valeur du délai d'attente va être lue à partir d'un lot mais rarement écrite (si ce n'est jamais au démarrage de l'application par le code dans Global.asax). – mikesigs

+0

@whatispunk: Eh bien, ça ne fera pas de mal ... mais ça n'aidera pas beaucoup non plus. Pourquoi utiliseriez-vous les deux? Volatile est suffisant pour le cas 'int' ... –

+0

Merci pour votre aide. J'essaie juste de comprendre ce que tout cela signifie. Il semble y avoir des opinions divergentes sur l'utilisation de volatiles et je ne comprends même pas la plupart du jargon derrière cela, c'est-à-dire plusieurs processeurs et ordres d'instructions, etc. Il faut absolument prendre le temps de lire sur le multithreading. – mikesigs

0

Vous n'avez pas besoin de verrouiller ici si le client de CacheHelper ne somthing comme

CacheHelper.TimeoutInMinutes = input.Value; 

Comme il ne repose pas sur la valeur précédente.

Si votre client fait quelque chose comme

CacheHelper.TimeoutInMinutes += input.Value; 

Ensuite, vous aurez besoin de faire quelques verrouillage

.

Questions connexes