¿Es seguro el subproceso de clase con la inicialización de la instancia?

Entiendo que MyClassno se puede hacer que los subprocesos sean seguros simplemente sincronizando sus métodos setter y getter.

Eso no es correcto.

Siempre que la referencia de una MyClassinstancia se publique de forma segura en todos los subprocesos que la utilizan, los synchronizedcaptadores y definidores verán el estado inicial correcto para el objeto.

Si declara content(y cualquier otro campo) final, puede prescindir del requisito de publicación segura. Sin embargo, dado que esta no es una clase inmutable, será necesario que el getter y el setter se sincronicen.


La semántica especial para finalcampos (como se describe en JLS 17.5) permite que los objetos verdaderamente inmutables sean seguros para subprocesos sin ningún gasto de sincronización. Pero esta semántica no es directamente aplicable en su ejemplo porque el "setter" está mutando el objeto.


Por cierto, si contenttenía tipo en StringBufferlugar de StringBuilderAND, la variable era final. El resultado sería "en su mayoría" sin hilos synchronized. Eso es porque StringBuilderes seguro para subprocesos para estas operaciones. El único inconveniente es que su "setter" está llamando appenddos veces. Sin a synchronized, sería posible que un captador vea el estado intermedio del búfer.

Respuesta 1

La inmutabilidad no siempre es la respuesta a la seguridad del hilo. Primero examinemos los posibles problemas de seguridad de subprocesos en el código existente. El problema potencial es cuando tiene dos hilos (A y B) accediendo al método setter setContent() simultáneamente . Eso daría como resultado una Cadena de salida aleatoria que podría parecer Some String Some String more String Some String Some Stringporque no tiene forma de asegurarse de que more Stringdebe agregarse inmediatamente después Some String.

Esa lógica podría estar perfectamente bien en su aplicación. Sin embargo, si aún necesita asegurarse de que esas dos declaraciones anexas se agreguen juntas , es cuando se produce la sincronización. En ese caso, podría sincronizar el método de establecimiento para asegurarse de que solo un hilo a la vez pueda acceder a él.

No se preocupe por tenerlo null StringBuilderporque no se accederá a su método sin instanciar MyClassprimero la instancia.

Espero que esto ayude

Respuesta: 2

He estado mirando el ejemplo publicado en OpenNTF: http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=Threads%20and%20Jobs mi problema es que parece que no puedo referirme a ...

Tengo una aplicación Java, y necesito información de ubicación. basado en una determinada IP. Actualmente, estoy usando http://freegeoip.net. Estoy usando Java, y lo que hago es obtener la información de geolocalización para el mencionado ...

Sé que esta pregunta apareció durante mucho tiempo, pero ninguna de las soluciones me funcionó. Maven lanza "java.lang.OutOfMemoryError" Cómo lidiar con "java.lang ...

Estoy creando un archivo de Excel usando el siguiente código de la clase pública ResultSetToExcel {libro de trabajo privado HSSFWorkbook; hoja de hoja HSSFS privada; HSSFFont privado boldFont; privado ...