Esta página se tradujo automáticamente con la API de traducción de Google Cloud.
Algunas páginas se pueden leer mejor en su totalidad.
En la programación de subprocesos múltiples, a menudo es necesario limitar la cantidad de subprocesos que pueden acceder a un recurso o bloque de código en un momento dado. Esto se conoce como control de concurrencia.
Una forma de lograr el control de concurrencia en Java es usar la clase java.util.concurrent.Semaphore
.
Un semáforo es un token que permite que un subproceso ingrese a una sección crítica, que es un bloque de código que solo puede ser ejecutado por un subproceso a la vez. Cuando el subproceso sale de la sección crítica, devuelve el semáforo al grupo.
Se puede usar un semáforo para controlar el acceso a cualquier recurso, no solo al código. Por ejemplo, se puede usar un semáforo para controlar el acceso a una impresora o base de datos.
Se crea un semáforo especificando el número de permisos. Este es el número de subprocesos que pueden acceder a la sección crítica al mismo tiempo. Por ejemplo, para crear un semáforo con 10 permisos:
Semaphore semaphore = new Semaphore(10);
Un hilo solicita un permiso llamando al método acquire()
. Este método bloquea el subproceso hasta que haya un permiso disponible. Por ejemplo:
semaphore.acquire();
Cuando un hilo sale de la sección crítica, llama al método release()
para devolver el permiso al semáforo. Por ejemplo:
semaphore.release();
El siguiente ejemplo muestra cómo usar un semáforo para controlar el acceso a una impresora.
import java.util.concurrent.Semaphore;
public class Printer {
private Semaphore semaphore;
public Printer(int numPermits) {
semaphore = new Semaphore(numPermits);
}
public void print(String document) {
try {
semaphore.acquire();
// print the document
} catch (InterruptedException e) {
// handle error
} finally {
semaphore.release();
}
}
}
En este ejemplo, el método print()
adquiere un permiso antes de imprimir el documento. Si no hay permisos disponibles, el método acquire()
bloquea el hilo hasta que haya uno disponible. Después de imprimir el documento, el método release()
devuelve el permiso al semáforo.
Los semáforos y los candados son ambos mecanismos para el control de concurrencia. Sin embargo, hay algunas diferencias clave entre ellos.
La clase java.util.concurrent.Semaphore
de Java proporciona un mecanismo para el control de concurrencia. Los semáforos se pueden usar para controlar el acceso a cualquier recurso, no solo al código. Al usar semáforos, es importante recordar las diferencias entre semáforos y candados.