¿C # tiene su propia versión de la palabra clave "sincronizada" de Java?
Es decir, en Java se puede especificar a una función, un objeto o un bloque de código, así:
public synchronized void doImportantStuff() {
// dangerous code goes here.
}
o
public void doImportantStuff() {
// trivial stuff
synchronized(someLock) {
// dangerous code goes here.
}
}
[MethodImpl(MethodImplOptions.Synchronized)]
línea.Respuestas:
Primero: la mayoría de las clases nunca necesitarán ser seguras para subprocesos. Use YAGNI : solo aplique seguridad de hilo cuando sepa que realmente lo va a usar (y probarlo).
Para las cosas de nivel de método, hay
[MethodImpl]
:Esto también se puede usar en accesores (propiedades y eventos):
Tenga en cuenta que los eventos similares a campos se sincronizan de manera predeterminada, mientras que las propiedades implementadas automáticamente no lo son :
Personalmente, no me gusta la implementación
MethodImpl
ya que se bloqueathis
otypeof(Foo)
, lo que va en contra de las mejores prácticas. La opción preferida es usar sus propios bloqueos:Tenga en cuenta que para eventos de tipo campo, la implementación de bloqueo depende del compilador; en los compiladores de Microsoft más antiguos es un
lock(this)
/lock(Type)
, sin embargo, en los compiladores más recientes usaInterlocked
actualizaciones, por lo que es seguro para subprocesos sin las partes desagradables.Esto permite un uso más granular y permite el uso de
Monitor.Wait
/Monitor.Pulse
etc para comunicarse entre subprocesos.Una entrada de blog relacionada (luego revisada ).
fuente
MethodImpl
y los eventos de campo ahora generan un buen código de sincronización, y ya no es necesario usar sus propios bloqueos.fuente
No. En C #, explícitamente
lock
recursos en los que desea trabajar sincrónicamente a través de subprocesos asincrónicos.lock
abre un bloque No funciona a nivel de método.Sin embargo, el mecanismo subyacente es similar ya que
lock
funciona invocandoMonitor.Enter
(y posteriormenteMonitor.Exit
) en el tiempo de ejecución. Java funciona de la misma manera, de acuerdo a la documentación de Sun .fuente
synchronized
el método on de Java es básicamentesynchronized (this.getClass())
¿no sería similar en C #lock(typeof(this))
?synchronized
palabra clave de java en un método es más como:,synchronized(this)
solo en un método estático se comporta comosynchronized(class)
.Tome nota, con caminos completos la línea:
[MethodImpl(MethodImplOptions.Synchronized)]
debería verse como[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
fuente
using System.Runtime.CompilerServices;
Puede usar la
lock
declaración en su lugar. Creo que esto solo puede reemplazar la segunda versión. Además, recuerde que tantosynchronized
ylock
necesidad de trabajar con un objeto.fuente