viernes, junio 29, 2007

Patrones de uso para volatile en Java

viernes, junio 29, 2007 por Martín

Brian Goetz gurú de la concurrencia en Java y autor del aclamado Java Concurrency in Practice ha publicado un excelente artículo en developerWorks titulado Managing volatibility en explica como funciona la palabra volatile en Java el que expone diferentes patrones para su uso.

Básicamente la diferencia entre volatile y utilizar synchronized es que volatile sólo te garantiza la visibilidad entre threads para esos atributos una vez que sus valores son modificados, mientras que synchronized te garantiza también la exclusión mutua. Utilizar volatile suele ser más barato a la hora de escribir que el adquirir locks pero plantea riesgos en cuanto a thread-safety que realmente hacen que sólo se utilice cuando realmente se sabe lo que se está haciendo. Ahí es donde Brian Goetz hace realmente un excepcional trabajo exponiendo varios patrones para su uso. Me permito resumirlos aquí:


  • Variables de estado: El caso más típico, marcar como volatile el típico atributo true/false. Las operaciones son simples y la visibilidad del estado es inmediata.

  • Inicialización única: Utilizar volatile para la típica inicialización perezosa de un objeto. El ejemplo típico sería el idioma double-checked-locking.

  • Publicación de estado de variables públicas: Tener variables públicas que otros threads estarán observando. Al actualizar el estado estas variables volatile lo reflejarán inmediatamente.

  • Beans volatiles: Declarar los atributos volatiles en el JavaBean y ofrecer métodos get/set simples sin ninguna operación adicional.

  • Bloqueos baratos: La idea aquí es mezclar el uso de volatile y synchronized para mejorar el rendimiento. De este modo las operaciones que requieran thread-safety estarán sincronizadas y el resto simplemente manejarán el atributo volatile

comments

0 Respuestas a "Patrones de uso para volatile en Java"