2. Synchronization
Problema: Codificar un programa que
demuestre el conflicto en los recursos.
Supongamos que queremos crear e iniciar
cien hilos, cada uno de los cuales agrega
un centavo a un piggy bank.
6. The keyword synchronized
Para evitar el conflicto con los recursos
Java utiliza la palabra clave synchronized
para sincronizar la invocación del método
de tal forma que sólo un hilo puede
acceder a un método a la vez.
Para coordinar la corrupción de los datos
reescribimos el programa
PiggyBankWithSync.java
8. The keyword synchronized
En el caso de un método de instancia el
cerrojo esta en el objeto para el cual el
método fue invocado.
En el caso de un método de clase (static)
el cerrojo esta en la clase.
9. The keyword synchronized
Si un hilo invoca un método de instancia
sincronizado (respectivamente un método
static) en un objeto, el cerrojo para el
objeto ( respectivamente, la clase) se
adquiere primero, luego el método es
ejecutado y finalmente el cerrojo es
liberado.
10. The keyword synchronized
Ud. Puede reescribir el programa para
agregar un método sincronizado de
instancia con el nombre addPenny en la
clase PiggyBank.
En este caso el cerrojo será un simple
objeto PiggyBank, lo cual es suficiente
para asegurar que un sólo hilo pueda
ejecutar el método addPenny en cualquier
momento. Ejercicio 15.11
11. Synchronized Statements
Al invocar un método sincronizado de un
objeto se adquiere un cerrojo en el objeto
y al invocar un método static sincronizado
de una clase se adquiere el cerrojo en la
clase.
12. Synchronized Statements
La sentencia synchronized puede ser
usada para adquirir un cerrojo en
cualquier objeto no sólo “this” cuando
ejecutamos un bloque de código dentro
del método.
14. Synchronized Statements
La expresión “expr” debe ser evaluada en
la referencia del objeto.
Si el objeto ya tiene un cerrojo de otro hilo,
el hilo es bloqueado hasta que el cerrojo
es liberado.
15. Synchronized Statements
Cuando un cerrojo es adquirido en un
objeto las sentencias dentro del bloque
sincronizado se ejecutan y luego el cerrojo
es liberado.
16. Synchronized Statements
La sentencia synchronized le permite
sincronizar parte del código dentro del
método en lugar de todo el método. Esto
mejora la concurrencia.
17. Synchronized Statements
La sentencia synchronized le permite
adquirir un cerrojo en cualquier objeto de
tal manera que UD. Puede sincronizar el
acceso a un objeto en lugar de todo el
método.
18. Synchronized Statements
cualquier método de instancia puede ser
convertido en una sentencia synchronized.
Suponga que tenemos el siguiente
método de instancia:
public synchronized void xxmethod(){
… method body
}