C # a-t-il sa propre version du mot-clé "synchronisé" java?
C'est-à-dire en java, il peut être spécifié soit pour une fonction, un objet ou un bloc de code, comme ceci:
public synchronized void doImportantStuff() {
// dangerous code goes here.
}
ou
public void doImportantStuff() {
// trivial stuff
synchronized(someLock) {
// dangerous code goes here.
}
}
[MethodImpl(MethodImplOptions.Synchronized)]
ligne.Réponses:
Premièrement - la plupart des classes n'auront jamais besoin d'être thread-safe. Utilisez YAGNI : n'appliquez la sécurité des threads que lorsque vous savez que vous allez réellement l'utiliser (et le tester).
Pour les choses au niveau de la méthode, il y a
[MethodImpl]
:Cela peut également être utilisé sur les accesseurs (propriétés et événements):
Notez que les événements de type champ sont synchronisés par défaut, tandis que les propriétés implémentées automatiquement ne le sont pas :
Personnellement, je n'aime pas l'implémentation
MethodImpl
car elle se verrouillethis
outypeof(Foo)
- ce qui est contraire aux meilleures pratiques. L'option préférée consiste à utiliser vos propres verrous:Notez que pour les événements de type champ, l'implémentation de verrouillage dépend du compilateur; dans les anciens compilateurs Microsoft, il s'agit d'un
lock(this)
/lock(Type)
- cependant, dans les compilateurs plus récents, il utilise desInterlocked
mises à jour - donc thread-safe sans les parties désagréables.Cela permet une utilisation plus granulaire et permet l'utilisation de
Monitor.Wait
/Monitor.Pulse
etc pour communiquer entre les threads.Une entrée de blog connexe ( revisitée plus tard ).
la source
MethodImpl
et les événements de type champ génèrent désormais un bon code de synchronisation, et il n'est plus nécessaire d'utiliser vos propres verrous.la source
Non. En C #, vous avez explicitement des
lock
ressources sur lesquelles vous souhaitez travailler de manière synchrone sur des threads asynchrones.lock
ouvre un bloc; cela ne fonctionne pas au niveau de la méthode.Cependant, le mécanisme sous-jacent est similaire car
lock
fonctionne en invoquantMonitor.Enter
(et par la suiteMonitor.Exit
) sur le runtime. Java fonctionne de la même façon, selon la documentation Sun .la source
synchronized
méthode on de Java n'est fondamentalementsynchronized (this.getClass())
pas la même chose en C #lock(typeof(this))
?synchronized
mot - clé de java sur une méthode ressemble plus à :,synchronized(this)
seulement sur une méthode statique, il se comporte commesynchronized(class)
.Prenez note, avec des chemins complets la ligne:
[MethodImpl(MethodImplOptions.Synchronized)]
devrait ressembler[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
la source
using System.Runtime.CompilerServices;
Vous pouvez utiliser l'
lock
instruction à la place. Je pense que cela ne peut que remplacer la deuxième version. Rappelez - vous aussi que les deuxsynchronized
et ontlock
besoin pour fonctionner sur un objet.la source