Recordemos, el funcionamiento de los procesos cliente y suministrador podría ser el siguiente:
- Utilizan un recurso del sistema a modo de buffer compartido en el que, el suministrador introduce elementos; y, el cliente los extrae.
- Se sincronizarán utilizando una variable compartida que indica el número de elementos que contiene ese buffer compartido, cuyo tamaño máximo será N.
- El proceso suministrador, siempre comprueba antes de introducir un elemento, que esa variable tenga un valor menor que N. Al introducir un elemento incrementa en uno la variable compartida.
- El proceso cliente, extraerá un elemento del buffer y decrementará el valor de la variable; siempre que el valor de la variable indique que hay elementos que consumir.
Los mecanismos de sincronismo que nos permiten el anterior funcionamiento entre procesos, son las lecturas y escrituras bloqueantes en recursos compartidos del sistema (streams
). En el caso de java, disponemos de:
- Arquitectura java.io.
- Implementación de clientes: Para sus clases derivadas de Reader como son InputStream, InputStreamReader, FileReader, …; los métodos read(buffer) y read(buffer, desplazamiento, tamaño).
- Implementación de suministradores: Con sus análogos derivados de Writer; los métodos write(info) y write(info, desplazamiento, tamaño).
- Arquitectura java.nio (disponible desde la versión 1.4 de Java). Dentro de java.nio.channels:
- Implementación de clientes: Sus clases
FileChannel
ySocketChannel
; los métodosread(buffer)
yread(buffer, desplazamiento, tamaño)
. - Implementación de suministradores: Sus clases
FileChannel
ySocketChannel
; los métodoswrite(info)
ywrite(info, desplazamiento, tamaño)
.
- Implementación de clientes: Sus clases