Hola Ale,

El double check lock tiene dos chequeos (por null) y se utiliza para la
inicializacion de una variable, seria asi:

class Foo {****

        private static object _syncRoot = new object();****

         ****

        public void Bar(){****

            if (objetoACrear == null) {

                lock (_syncRoot) {****

                    if (objetoACrear == null) {

                        lock (_syncRoot) {****

                            //haces el new del objetoACrear

                        }

                    }****

                }

            }****

        }****

    }

Yo no propuse un double check lock porque no se sirve para el caso de Damian

----------------------------------
Carlos Peix

2013/3/19 Alejandro Miralles <[email protected]>

> La forma infalible de implementar double checking es, como dice Carlos,
> utilizando la variable privada.****
>
> Por ejemplo:****
>
> class Foo {****
>
>         private static object _syncRoot = new object();****
>
>          ****
>
>         public void Bar(){****
>
>             lock (_syncRoot) {****
>
>                 //aca usas el diccionario****
>
>             }****
>
>         }****
>
>     }****
>
> ** **
>
> Si tenes algo similar al codigo anterior, problemas de thread no es seguro
> (al menos no relacionados al lock). ****
>
> Nosotros utilizamos esta técnica en un scripting engine que se utiliza
> server side en escenarios concurrentes y nunca tuvimos problemas.****
>
> ** **
>
> Saludos, Ale Miralles****
>
> http://amiralles.com.ar****
>
> http://blog.amiralles.com.ar****
>
> ** **
>
> ** **
>
> *From:* [email protected] [mailto:[email protected]] *On Behalf Of *Carlos
> Peix
> *Sent:* martes, 19 de marzo de 2013 01:47 p.m.
> *To:* [email protected]
> *Subject:* [puntonet] Manejo de memoria en ambientes sobrecargados****
>
> ** **
>
> La implementacion es correcta siempre y cuando no devuelvas referencias a
> mQueries fuera de la clase XXX. Cuidado con eso, si ese fuera el caso,
> seria preferible bloquear una referencia privada a una instancia de Object.
> ****
>
> ** **
>
> Saludos****
>
> ** **
>
> ----------------------------------
> Carlos Peix****
>
> 2013/3/19 Damián Herrera <[email protected]>****
>
> Hola Carlos,****
>
> ** **
>
> Me mataste, te copio como esta armado el Synclock del Dictionary, el
> object en cuestión es mQueries.****
>
> ** **
>
> *Class XXX*****
>
> ** **
>
> *Private mQueries As New Generic.Dictionary(Of String, String)*****
>
> ** **
>
> *Public Function GetQuery(ByVal pParameterCollection As
> ParameterCollection) As String*****
>
> *...*****
>
> *SyncLock mQueries*****
>
> *'Pregunto si existe el key, si no existe, escribo en mQueries....*****
>
> *End SyncLock*****
>
> ** **
>
> *Return mQueries(mQueryKey)*****
>
> *End Function*****
>
> ** **
>
> *End Class*****
>
> ** **
>
> ** **
>
> ** **
>
> ** **
>
>
> ****
>
> Saludos,****
>
> Ing. Damián Herrera
> Director
> CIVINEXT
> Tel. / Fax: +54 (11) 3968-0039
> [email protected]
> http://www.civinext.com****
>
>   **** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> El 19 de marzo de 2013 11:54, Carlos Peix <*[email protected]*>
> escribió:**** <http://www.linkedin.com/company/civinext-s.a.>
>
> OK, un XML de 500K puede ocupar 1 o 2 MB en memoria, pero tampoco es mucho.
> **** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> Respecto del SyncLock, habria que ver como esta hecho, pero si has tomado
> las precauciones, no creo que venga por ese 
> lado****<http://www.linkedin.com/company/civinext-s.a.>
>
>
> **** <http://www.linkedin.com/company/civinext-s.a.>
>
> ----------------------------------
> Carlos Peix**** <http://www.linkedin.com/company/civinext-s.a.>
>
> 2013/3/19 Damián Herrera 
> <*[email protected]*>****<http://www.linkedin.com/company/civinext-s.a.>
>
> Hola Carlos,**** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> Gracias por tu respuesta. Al XmlDocument lo escribo en el stratup del
> application protegido con un mutex para evitar asegurar que se escribe una
> unica vez, luego la consulta si es multi 
> thread.****<http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> Con el Dictionary no estoy seguro de lo que esta sucediendo, pero para
> escribirlo lo hago con un SyncLock para asegurar tambien el Thread Safe. La
> lectrura también es multi 
> thread.****<http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> Tarde en responderte porque estuve buscando en unos reportes del Debug
> Diagnostic Tool y no encontré específicamente esta info. Es decir,
> la encontré de un montón de otros objetos, pero no del XmlDocument ni del
> Generic.Dictionary. Para dimensionar el XmlDocument, busque todos los XML
> que tengo y con toda la furia llegaría a 500KB y el Dictionary debería ser
> similar o menor.**** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
>
> **** <http://www.linkedin.com/company/civinext-s.a.>
>
> Saludos,**** <http://www.linkedin.com/company/civinext-s.a.>
>
> Ing. Damián Herrera
> Director
> CIVINEXT
> Tel. / Fax: +54 (11) 3968-0039
> *[email protected]*
> *http://www.civinext.com*****<http://www.linkedin.com/company/civinext-s.a.>
>
>   **** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> El 18 de marzo de 2013 23:07, Carlos Peix <*[email protected]*>
> escribió:**** <http://www.linkedin.com/company/civinext-s.a.>
>
> Hola Damian,**** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> Por el lado del XMLDocument, no es una estructura muy buena para almacenar
> datos en memoria. Por un lado es muy poco eficiente en el uso de la memoria
> y no estoy seguro de que sea thread 
> safe.****<http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> Por el lado del Dictionary<,> seguro que no es thread safe para la
> escritura, deberias sincronizar el acceso para 
> lograrlo.****<http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> Ahora bien, no creo que ninguna de las dos estructuras "pierdan" objetos
> aunque haya mucha presión de 
> memoria.****<http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> Tenes una idea del tamaño de esas 
> estructuras?****<http://www.linkedin.com/company/civinext-s.a.>
>
>
> **** <http://www.linkedin.com/company/civinext-s.a.>
>
> ----------------------------------
> Carlos Peix**** <http://www.linkedin.com/company/civinext-s.a.>
>
> 2013/3/18 Damián Herrera 
> <*[email protected]*>****<http://www.linkedin.com/company/civinext-s.a.>
>
> Buenas,**** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> Espero que anden bien. Hace mucho que no escribo y buscando algo de info.
> me pareció que era algo para postear en la 
> lista.****<http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> Actualmente tenemos un problema en ambientes de alto
> trafico, básicamente manejamos Generic.Dictionary(string,string) y
> Xml.XmlDocument. Únicamente en ambientes de alto trafico, nos sucede de vez
> en cuando que desaparecen elementos del Dictionary o el XmlDocument
> queda vacío.**** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> Sospecho que el XMLDocument queda vacío porque hay momentos en los que no
> se utiliza porque hay una capa de cache que hace que se lo consulte poco,
> pero la referencia sigue activa dentro de una clase (esta declarado como
> private shared). Algo similar ocurre con el Dictionary, pero este se usa
> más que el XmlDocument.****<http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> La consulta en si misma es, hay alguna forma de "marcar" o especificar que
> esas variables no deben ser recolectadas o alguna manera de que me entere
> cuando las recolectan? Es algo que estuve buscando y no encontré mucha
> info. y no estoy seguro que tenga que ver con el 
> GC.****<http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> Bueno, cualquier orientación se 
> agradece.****<http://www.linkedin.com/company/civinext-s.a.>
>
>
> **** <http://www.linkedin.com/company/civinext-s.a.>
>
> Saludos!**** <http://www.linkedin.com/company/civinext-s.a.>
>
> Ing. Damián Herrera
> Director
> CIVINEXT
> Tel. / Fax: +54 (11) 3968-0039
> *[email protected]*
> *http://www.civinext.com*****<http://www.linkedin.com/company/civinext-s.a.>
>
>   **** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
> ** ** <http://www.linkedin.com/company/civinext-s.a.>
>
>

Responder a