concurrencia ejemplo
El problema clásico de lectores y escritores se plantea para el acceso concurrente a un
recurso compartido, en este caso se trata de una base de datos. En las bases de datos la
información se almacena en tablas. Cada tabla consta de una cabecera, que indica el tipo de
información almacenada y las f ilas representan los datos (es decir, losregistros).
Asegurar la integridad de los datos en una base de datos exige que los procesos de
escritura de datos (inserción y actualización) en las tablas se hagan en exclusión mutua. En
caso contrario, la escritura de datos puede propiciar datos inconsistentes.
Implementación de la base de datos
El esquema de la base de datos con la que se trabajará se muestra a continuación:TablaNombre
Clave
1001
1002
..
1100
Nombre
Monserrat
Manuel
…
Fabian
TablaApellidos
Clave
1001
1002
..
1100
Apellidos
Sarmiento Luna
Olmedo Cortez
…
Montiel Uribe
TablaRfc
Clave
1001
1002
..
1100
RFC
SALM980101
OLCM980220
…
MOUF990330
TablaDirecciones
Clave
1001
1002
..
1100
Dirección
Boulevard 5 de Mayo 2114
Av. 14 sur 6789
…
Av. Circunvalación1802
Cada registro contiene la información de una persona: clave de tipo int; rfc, nombre,
apellidos y dirección de tipo String. El campo rfc, al igual que clave, actúan como identificador
único y por tanto no pueden ser modificados, pero los demás campos pueden actualizarse. Es
conveniente aclarar que en este caso se ha optado por almacenar cada uno de los campos de
los registros en una tabladistinta.
El código correspondiente para la implementación de la base de datos y la realización de los
puntos planteados en la práctica se presenta a continuación:
import java.util.Hashtable;
class BaseDeDatos{
private Hashtable tablaRfc;
private Hashtable tablaNombre;
private Hashtable tablaDireccion;
private Hashtable tablaApellidos;
//Constructor
public BaseDeDatos(){this.tablaNombre = new Hashtable();
this.tablaApellidos = new Hashtable();
this.tablaRfc = new Hashtable();
this.tablaDireccion = new Hashtable();
}
//Constructor
public BaseDeDatos(Hashtable nombres, Hashtable apellidos, Hashtable rfcs, Hashtable
direcciones){
this.tablaNombre = nombres;
this.tablaApellidos = apellidos;
this.tablaRfc = rfcs;
this.tablaDireccion = direcciones;
}
public HashtablegetTablaNombre(){
return this.tablaNombre;
}
public Hashtable getTablaApellidos(){
return this.tablaApellidos;
}
public Hashtable getTablaRfc(){
return this.tablaRfc;
}
public Hashtable getTablaDirecciones(){
return this.tablaDireccion;
}
public String getNombre(int clave){
return (String) this.tablaNombre.get(clave);
}
public String getApellidos(int clave){
return (String)this.tablaApellidos.get(clave);
}
public String getRfc(int clave){
return (String) this.tablaRfc.get(clave);
}
public String getDireccion(int clave){
return (String) this.tablaDireccion.get(clave);
}
public void updateNombre(int clave, String nombre){
this.tablaNombre.remove(clave);
this.tablaNombre.put(clave, nombre);
}
public void updateApellidos(int clave, String apellidos){this.tablaApellidos.remove(clave);
this.tablaApellidos.put(clave, apellidos);
}
public void updateDireccion(int clave, String direccion){
this.tablaDireccion.remove(clave);
this.tablaDireccion.put(clave, direccion);
}
public void insertarRegistro(int clave, String nombre, String apellidos, String rfc, String
direccion){
this.tablaNombre.put(clave, nombre);
this.tablaApellidos.put(clave, apellidos);this.tablaRfc.put(clave, rfc);
this.tablaDireccion.put(clave, direccion);
}
}
Para evitar inconsistencias en los datos los diferentes procesos deben realizar las
escrituras en exclusión mutua. Recordar que la exclusión mutua en Java se suele implementar
mediante cerrojos (locks), los cuales son equivalentes a los semáforos. Por tanto, quien accede
a un dato y ha tomado previamente el...
Regístrate para leer el documento completo.