Leí en "Java Concurrency In Practice" que "publicar objetos antes de que estén completamente construidos puede comprometer la seguridad del hilo". ¿Podría alguien explicar esto?publicando objetos y seguridad de hilos
Respuesta
nuevo operador puede devolver un valor antes de que termine el constructor de la clase. Entonces una variable puede no leer nulo pero contiene una instancia de clase no inicializada. Esto sucede debido a la reordenación de bytes.
Algunas aclaraciones: Desde una perspectiva de subproceso único, la JVM puede reordenar algunas instrucciones. Al crear una instancia que tradicionalmente se podría pensar que es la siguiente:
- asignar memoria
- plazo de inicialización (constructor)
- referencia asignar a var
Mientras que, de hecho, la JVM podría hacer algo como:
- asignar memoria Referencia
- asignar a var
- plazo de inicialización (constructor)
Esto tiene ventajas de rendimiento ya que las direcciones no tienen que ser las operaciones de búsqueda de nuevo. Desde una perspectiva de hilo único esto no cambia el orden de la lógica. Tu programa funciona bien. Pero esto plantea un problema en el código multiproceso. Esto significa que la referencia puede publicarse antes de que se ejecute el constructor. Por lo tanto, necesita una regla 'pasar antes' para asegurarse de que la instancia esté completamente inicializada. La declaración de variables volátiles obligará a las reglas anteriores.
Más sobre reordenamiento: http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#reordering
consideran este código:
public class World{
public static Point _point;
public static void main(String[] args){
new PointMaker().start();
System.out.println(_point);
}
}
public class Point{
private final int _x, _y;
public Point(int x, int y){
_x = x;
World._point = this;//BAD: publish myself before I'm fully constructed
//some long computation here
_y = y;
}
public void toString(){
return _x + "," + _y;
}
}
public class PointMaker extends Thread{
public void run(){
new Point(1, 1);
}
}
Debido Point
publica en sí antes de ajustar el valor de _y
, la llamada a println
puede producir "1,0"
en lugar de la "1,1"
esperado.
(Tenga en cuenta que también puede producir si "null"
PointMaker
+ Point.<init>
no obtienen lo suficiente para establecer el campo World._point
antes de la llamada a println
ejecuta.)
Para ser exactos, incluso puede imprimir "0,0". Si filtremos esta referencia del constructor, el JLS no ofrece garantías finales. – Voo
- 1. campos finales y seguridad de hilos
- 2. lucene buenas prácticas y seguridad de hilos
- 3. Lucene.NET, StandardAnalyzer, stopwords y seguridad de hilos
- 4. Devolución de llamada WCF, proxy y seguridad de hilos
- 5. Variables locales en método estático y seguridad de hilos
- 6. Serialización en java: seguridad automática de hilos?
- 7. usando @Transactional para seguridad de hilos
- 8. Agregar delegado al evento - seguridad de hilos
- 9. Django, urlconfs dinámicos, seguridad de hilos
- 10. Android LruCache (Android 3.1) seguridad de hilos
- 11. Publicando en Tumblr usando oAuth y C#
- 12. NSPrivateQueueConcurrencyType de Datos Básicos y compartir objetos entre hilos
- 13. publicando los complementos de Grails
- 14. Seguridad de los hilos con el montón de memoria asignada
- 15. Seguridad de los hilos sobre la solicitud de inicio
- 16. publicando solicitud XML en java
- 17. Spring AOP y seguridad de hilos de aspecto para un HTTPServletRequest bean autoalineado
- 18. JQuery y Ajax.BeginForm() publicando los mismos datos dos veces
- 19. hilos de nomenclatura y conjuntos de hilos-piscinas de ExecutorService
- 20. Java hilos y basura colector
- 21. Java: Bibliotecas Swing y seguridad de subprocesos
- 22. Process.waitFor(), hilos y InputStreams
- 23. OpenMP y núcleos/hilos
- 24. Múltiples hilos y memoria
- 25. Vector de STL y seguridad de hilo
- 26. Hilos y descriptores de archivos
- 27. Hilos y escritura de archivos
- 28. jQuery AJAX Post no publicando datos
- 29. Tipo de seguridad: descarte sin marcar entre Objetos de clase
- 30. ASP.NET, VisualStudio 2010: ¿Web.config no está publicando?
Podría citar una fuente? – musiKk
@musiKk buena pregunta, buscándola. –
Hubiera pensado que, en lugar de esto, la referencia probablemente se trata de publicar el objeto dentro del constructor (o algo que llama). No puedo pensar en un caso en el que el nuevo operador devuelva una referencia de objeto antes de que se complete el constructor que se llama. – arcy