Bloqueo verificado dos veces en .NET

Resuelto erikkallen asked hace 15 años • 8 respuestas

Encontré este artículo que explica por qué el paradigma de bloqueo de doble verificación no funciona en Java. ¿Es el paradigma válido para .NET (en particular, C#), si se declaran variables volatile?

erikkallen avatar Dec 27 '08 18:12 erikkallen
Aceptado

El bloqueo de doble verificación ahora funciona tanto en Java como en C# (el modelo de memoria de Java cambió y este es uno de los efectos). Sin embargo, debes hacerlo exactamente bien. Si estropea las cosas aunque sea un poco, es posible que termine perdiendo la seguridad del hilo.

Como han indicado otras respuestas, si está implementando el patrón singleton , hay formas mucho mejores de hacerlo. Personalmente, si me encuentro en una situación en la que tengo que elegir entre implementar un bloqueo de doble verificación y un código de "bloqueo cada vez", optaría por bloquearlo cada vez hasta tener evidencia real de que está causando un cuello de botella. Cuando se trata de enhebrar, un patrón simple y obviamente correcto vale mucho.

Jon Skeet avatar Dec 27 '2008 11:12 Jon Skeet

.NET 4.0 tiene un nuevo tipo: Lazy<T>eso elimina cualquier preocupación por equivocarse en el patrón. Es parte de la nueva Biblioteca paralela de tareas.

Consulte el Centro de desarrollo de computación paralela de MSDN: http://msdn.microsoft.com/en-us/concurrency/default.aspx

Por cierto, hay un backport (creo que no es compatible) para .NET 3.5 SP1 disponible aquí .

David Messner avatar May 25 '2010 23:05 David Messner