Si creo clases, que se usan en este momento solo en un solo hilo, ¿debo hacerlas seguras para subprocesos, incluso si no las necesito en este momento? Podría suceder, que más tarde use esta clase en varios hilos, y en ese momento podría tener condiciones de carrera y podría tener dificultades para encontrarlos si no hubiera hecho la clase segura para subprocesos en primer lugar. ¿O debería hacer que la clase no sea segura para subprocesos, para un mejor rendimiento? Pero la optimización prematura es malvada.¿Debo siempre hacer que mi código java sea seguro para subprocesos o, por motivos de rendimiento, hacerlo solo cuando sea necesario?
Pregunta diferente: ¿Debo hacer que mis clases sean seguras para hilos si es necesario (si se usan en varios hilos, de lo contrario no) o debería optimizar este problema?)?
Si elijo una de las dos formas, ¿existen métodos para reducir las desventajas? ¿O existe una tercera posibilidad, que debería usar?
EDIT: explico el motivo por el cual se me ocurrió esta pregunta. En nuestra compañía, hemos escrito una administración de usuarios muy simple que escribe los datos en archivos de propiedades. Lo usé en una aplicación web y después de trabajar en él obtuve extraños errores, que la administración de usuarios olvidó las propiedades de los usuarios (incluido el nombre y la contraseña) y los roles. Eso fue muy molesto, pero no reproducible de manera consistente, así que creo que fue una condición de carrera. Como sincronicé todos los métodos de lectura y escritura desde/en el disco, el problema desapareció. Entonces pensé que probablemente me habrían evitado todas las molestias si hubiéramos escrito la clase con sincronización en primer lugar.
EDIT 2: Cuando miro las puntas del programador pragmático, vi la sugerencia n. ° 41: Diseñar siempre para la concurrencia. Esto no dice que todo el código debe ser seguro para subprocesos, pero dice que el diseño debe tener la concurrencia en mente.
Algo para ayudar a su análisis es no pensar en la concurrencia como una optimización prematura, sino más bien en una preocupación de rendimiento similar a BigO. Las observaciones de optimization-is-evil prematuras se refieren a personas que desenrollan bucles o construcciones condicionales crípticas switch-if en C/C++ que son imposibles de descifrar y mantener, y pueden no proporcionarle ninguna ganancia de rendimiento una vez que el compilador ha terminado código (o en java el tiempo de ejecución JIT). – reccles