IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

lock(maListe) vs lock(maListe.SyncRoot) ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 13
    Par défaut lock(maListe) vs lock(maListe.SyncRoot) ?
    Bonjour,

    Dans une application multithreadé utilisant une List<T> générique nommé maListe, je voudrais savoir si j'ai plutot intéret à utiliser lock(maListe) ou lock(((ICollection)maListe).SyncRoot).

    Est ce qu'un lock sur une collection diffère d'un lock sur un objet ?(Par exemple est ce qu'un lock sur une collection va faire aussi des "lock" sur les éléments de cette collection)

    Coté mémoire un objet utilisé dans un lock sera-t-il "recyclé" normalement par le GC ?

    Merci d'avance.

    Nara20

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Par défaut
    le lock sur un objet empeche tout autre thread d'y acceder.
    Cela implique donc que tout autre thread ne peut pas acceder à l'un de ses membres tel que SyncRoot
    Donc mieux vaut faire un lock sur ta liste.

    Concernant le GC je ne sais pas, peut etre que ca fait perdre un cycle, mais pourquoi cette question?

  3. #3
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par giova_fr Voir le message
    le lock sur un objet empeche tout autre thread d'y acceder.
    Non.

    Le fait de locker un objet "obj" bloque juste d'autres threads qui voudraient locker ce même objet "obj".

    lock (obj) ne bloque pas l'usage d'obj par les autres threads.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par nara20 Voir le message
    Dans une application multithreadé utilisant une List<T> générique nommé maListe, je voudrais savoir si j'ai plutot intéret à utiliser lock(maListe) ou lock(((ICollection)maListe).SyncRoot).
    Il me semble ça revient au même, du moins pour les collections génériques (pour les collections non génériques de .NET 1.0, je sais pas trop ce que ça change...).
    cf. ton autre discussion sur le même thème

    Citation Envoyé par nara20 Voir le message
    Est ce qu'un lock sur une collection diffère d'un lock sur un objet ?(Par exemple est ce qu'un lock sur une collection va faire aussi des "lock" sur les éléments de cette collection)
    Non, du point de vue du lock, une collection est un objet comme un autre. Ca ne fait pas de lock sur chaque item (d'ailleurs je ne vois pas trop à quoi ça servirait)

    Citation Envoyé par nara20 Voir le message
    Coté mémoire un objet utilisé dans un lock sera-t-il "recyclé" normalement par le GC ?
    Oui, il n'y a rien de particulier à ce niveau là (mais a priori il ne sera pas recyclé avant que le lock soit relaché)

    Citation Envoyé par giova_fr Voir le message
    le lock sur un objet empeche tout autre thread d'y acceder.
    Cela implique donc que tout autre thread ne peut pas acceder à l'un de ses membres tel que SyncRoot
    Non, pas du tout : ça empêche tout autre thread d'acquérir un lock sur le même objet, mais ça ne l'empêche pas d'y accéder... Donc l'utilisation de lock ne suffit pas à "sécuriser" l'accès à un objet : il faut que tout le monde se mette d'accord pour acquérir le lock avant d'accéder à l'objet

    EDIT: grillé par Guulh... voilà ce qui arrive quand on ouvre plein d'onglets et qu'on y revient 1/2 heure plus tard

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    nous on instancie un new object dans une variable de classe pour le lock
    dans le framework on voit beaucoup de lock(this)

    sinon jette un oeil au readerwriterlock, dans certains cas ca amène plus de performances qu'un lock
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    dans le framework on voit beaucoup de lock(this)
    Effectivement, et c'est d'ailleurs étonnant car c'est maintenant déconseillé par Microsoft...

    http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx
    In general, avoid locking on a public type, or instances beyond your code's control. The common constructs lock (this), lock (typeof (MyType)), and lock ("myLock") violate this guideline:

    * lock (this) is a problem if the instance can be accessed publicly.
    * lock (typeof (MyType)) is a problem if MyType is publicly accessible.
    * lock("myLock") is a problem because any other code in the process using the same string, will share the same lock.

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Effectivement, et c'est d'ailleurs étonnant car c'est maintenant déconseillé par Microsoft...
    c'est bien ce qu'il me semblait avoir lu dans msdn aussi
    y sont forts chez microsoft ^^
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2013] Locked qui ne lock rien du tout
    Par tmlpqsdpmdlc dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 18/03/2015, 14h01
  2. [Ubuntu / SQLITE_BUSY] Problème "The database file is locked (database is locked)"
    Par PP(Team) dans le forum Plateformes (Java EE, Jakarta EE, Spring) et Serveurs
    Réponses: 1
    Dernier message: 05/10/2012, 10h32
  3. Réponses: 1
    Dernier message: 28/06/2010, 18h02
  4. [Lock] Fonctionnement du lock sur InnoDB
    Par Traroth2 dans le forum Requêtes
    Réponses: 1
    Dernier message: 01/08/2006, 11h24
  5. Row lock
    Par cassandra dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 09/04/2003, 16h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo