Cómo entender el 0 en JAVA new Semaphore(0, true)
mSemaphore = new Semaphore(0, ture)
0 significa que el valor inicial de mSemaphore es cero. Quizás mSemaphore sea un control de límites como un caché. Cuando mSemaphore es cero, significa que está dentro del caché. Está vacío Cuando mSemaphore no es cero, significa que hay un valor en el caché.
Cada vez que inserto en el caché, ejecuto mSemaphore.release(). y luego obtenga el permiso mSemaphore..acquire(); luego pasará, lo que indica que el caché no está vacío en este momento y se pueden realizar las operaciones comerciales correspondientes
Caso (de la práctica de programación concurrente) :
@ThreadSafe
clase pública SemaphoreBoundedBuffer
/**
* disponibleItem representa el número de elementos que pueden eliminarse del caché El valor inicial es cero porque el estado inicial del caché está vacío
* El espacio disponible representa el número de elementos que se pueden insertar en el caché y su valor inicial es igual al. tamaño de caché
*/
Semáforo final privado elemento disponible, espacio disponible;
@GuardedBy("this") elemento E[] final privado;
@GuardedBy("this") private int putPosition = 0, takePosition = 0;
public SemaphoreBoundedBuffer (int capacidad) {
if (capacidad <= 0) p>
lanzar nueva IllegalArgumentException();
this.availableItem = new Semaphore(0);
this.availableSpace = new Semaphore(capacidad);
this.item = (E[]) new Object[capacidad];
}
public boolean isEmpty() {
return availableItem.availablePermits( ) == 0;
}
público booleano isFull() {
return availableSpace.availablePermits() == 0;
}
public void put(E x) lanza InterruptedException {
//Obtener un permiso de inserción
availableSpace.acquire();
doInsert(x);
// Libera el permiso, lo que indica que el caché no está vacío y ejecuta adquirir si no está vacío. Regresará mediante permiso
availableItem.release( );
}
public E take() lanza InterruptedException {
//De disponibleItem obtiene un permiso. Si el caché no está vacío, la solicitud se realiza correctamente. inmediatamente, de lo contrario se bloquea hasta que el caché no esté vacío
availableItem.acquire
();
//Eliminar el siguiente elemento en el caché
E item = doExtract();
//Devolver un semáforo de permiso a la señal de espacio disponible La cantidad indica que se puede insertar un caché más
availableSpace.release();
devolver elemento;
}
público sincronizado void doInsert (E x) {
int i = putPosition;
item[i] = x;
putPosition = (++i == item. longitud) 0: i;
}
público sincronizado E doExtract() {
int i = takePosition;
E x = elemento [i];
elemento[i] = nulo;
takePosition = (++i == elemento.longitud 0: i;
regresar x;
}
}