Sí, es seguro para hilos y sí, le evita usar cerraduras por todas partes (lo que sea que eso signifique). Por supuesto, eso solo le proporcionará un acceso seguro a los hilos de los datos almacenados en este diccionario, pero si los datos en sí no son seguros para hilos, entonces necesita sincronizar el acceso a ellos, por supuesto. Imagine, por ejemplo, que ha almacenado en este caché un List<T>
. Ahora thread1 obtiene esta lista (de una manera segura para hilos, ya que el diccionario simultáneo le garantiza esto) y luego comienza a enumerar sobre esta lista. Exactamente al mismo tiempo, thread2 obtiene esta misma lista de la caché (de una manera segura para hilos, ya que el diccionario simultáneo le garantiza esto) y escribe en la lista (por ejemplo, agrega un valor). Conclusión: si no ha sincronizado thread1, tendrá problemas.
En lo que se refiere a usarlo como caché, bueno, probablemente no sea una buena idea. Para el almacenamiento en caché, te recomendaría lo que ya está incorporado en el marco. Clases como MemoryCache por ejemplo. La razón de esto es que lo que está integrado en el ensamblaje System.Runtime.Caching
está, explícitamente, construido para el almacenamiento en caché => maneja cosas como la expiración automática de datos si comienza a ejecutar poca memoria, devoluciones de llamadas para los elementos de caducidad de caché, e incluso estaría capaz de distribuir su caché en varios servidores usando cosas como memcached, AppFabric, ..., todo lo que no podría soñar con un diccionario simultáneo.
¿La clase MemoryCache es segura para subprocesos como el ConcurrentDictionary? – michael
@michael, sí, es seguro para subprocesos, pero es absolutamente el mismo comentario sobre la sincronización de acceso a objetos que no son seguros para subprocesos y que podría estar almacenando en este caché. –
Oh, entiendo esa parte. Pero, para que otros lectores puedan entender, lo voy a reiterar. Usted dice que las clases 'ConcurrentDictionary' y' MemoryCache' son seguras para hilos, pero no se garantiza que los contenidos estén dentro de subprocesos. :) – michael