2010-05-21 25 views
17

Si creo una instancia única de un Comparador, ¿se puede usar esa instancia en varios subprocesos para ordenar las colecciones mediante Collections.sort()? O bien, ¿necesito crear una nueva instancia del Comparador para cada llamada a Collections.sort() para garantizar la seguridad del hilo?En Java, ¿es seguro un Comparador utilizado en Collections.sort()?

Respuesta

18

Eso depende completamente de cómo implemente el Comparator. Si, por ejemplo, tiene variables de instancia que se escriben en o cuyos contenidos se cambian implícitamente durante la comparación, no sería seguro.

La mayoría de las implementaciones de Comparator no hacen tal cosa, pero un escenario que podría ocurrir razonablemente es usar un SimpleDateFormat para comparar cadenas que representan fechas. Lamentablemente, SimpleDateFormat no es seguro para subprocesos.

5

Comparador es una interfaz, no tiene propiedades de simultaneidad inherentes. Depende de cómo lo escriba si su implementación es segura o no. Si todo lo que hace se limita al alcance del método de comparación (sin instancias o estado de nivel de clase) y todos los recursos que utiliza son seguros para la ejecución de los hilos, entonces será en sí mismo seguro para la tarea.

0

Me sorprendería mucho si encontrara un Comparador que no sea seguro para subprocesos, ya que generalmente (¿siempre?) Se reentran.

El problema de concurrencia sería si la colección que se estaba ordenando se cambiaba mientras se producía el ordenamiento.

+2

Es razonable que pueda estar utilizando algún recurso dentro del método de comparación que no sea seguro para subprocesos. Una colección no sincronizada, un calendario, etc. editar: lo que dijo Michael B^ – Affe

+1

Tienes razón, no había contemplado esos casos. – Artefacto

Cuestiones relacionadas