"¡Hola, amigo!"
"Sí, estoy aquí, estoy aquí".
"Hoy, les hablaré sobre el uso sincronizado en la práctica".
"Cuando un programa tiene muchos objetos y subprocesos, a menudo sucede que varios subprocesos trabajan con el mismo objeto simultáneamente. Al hacerlo, los subprocesos interfieren entre sí".
"Sí, ya sé esto".
"Entonces, digamos que tiene un objeto al que acceden varios subprocesos. Puede hacer dos cosas para evitar problemas".
"El primero es usar bloques sincronizados para envolver cada ubicación donde se accede al objeto. Pero este enfoque puede no funcionar si algún programador escribe código que accede al objeto directamente, sin un bloque sincronizado".
"Por lo tanto, se usa un segundo enfoque la mayor parte del tiempo: hacer que el objeto sea seguro para subprocesos". "En otras palabras, el mecanismo sincronizado está integrado en el objeto mismo: declara sus métodos sincronizados y/o envuelve el código dentro de sus métodos en bloques sincronizados".
"Entonces, cualquier objeto que pueda usar de múltiples subprocesos, y esto es casi todos los objetos en el programa, ¿tengo que hacerlo seguro para subprocesos?"
"En general, sí. En realidad, no todos los objetos en un programa son utilizados por diferentes subprocesos, pero generalmente hay muchos. Entonces, cuando comienza a escribir código para un subproceso y accede a varios objetos desde él, luego con cada llamada de método debes preguntarte, «¿Es segura esta llamada?»"
"¿Seguro?"
"Seguro para subprocesos, lo que significa que se puede llamar de forma segura desde múltiples subprocesos".
"Aquí hay algunos ejemplos. Supongamos que tiene un objeto String al que se accede desde diferentes subprocesos. Como ya se suponía que debía recordar, String es inmutable , al igual que todos los demás tipos primitivos. Esto significa que un objeto no cambia después de que se crea . Esto significa que es imposible "romper" dicho objeto. Todos los objetos inmutables son seguros para subprocesos".
"Bueno, eso hace las cosas más fáciles".
"Ahora, supongamos que necesita una cadena mutable".
"Sí, lo recuerdo. Hay dos tipos de cadenas de este tipo: StringBuffer y StringBuilder. StringBuffer es como StringBuilder, pero todos sus métodos están sincronizados. ¿También es seguro para subprocesos?"
"Sí. Si necesita acceder a un objeto StringBuilder desde varios subprocesos, debe reemplazarlo con un StringBuffer. De lo contrario, tarde o temprano los subprocesos lo cambiarán al mismo tiempo y lo "romperán".
"¿Qué sucede si el objeto al que se accede desde diferentes subprocesos es un objeto de mi propia clase? ¿También necesito agregar sincronizado a sus métodos en este caso?"
"Sí. Es mejor seguir esta regla: todos los objetos a los que se accederá desde diferentes subprocesos deben ser seguros para subprocesos".
"Ya veo. No pensé que todo fuera tan serio. Gracias, Ellie".
"De nada. Espero que estos consejos te ayuden cuando Diego te dé algunas de sus tareas fáciles. ☺"
GO TO FULL VERSION