Perdon, cometi un error en el codigo, deje un lock de mas :-)

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) {

                        //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 Carlos Peix <[email protected]>

> 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