Cerrar con llave
定义:bloqueo ReentrantLock final privado = new ReentrantLock();
-
A partir de JDK5.0, Java proporciona un mecanismo de sincronización de subprocesos más potente: para lograr la sincronización mediante la definición explícita de objetos de bloqueo de sincronización. Los bloqueos sincronizados utilizan objetos de bloqueo para actuar como
-
La clase ReentrantLock (bloqueo reentrante) implementa Lock, que tiene la misma concurrencia y semántica de memoria que sincronizado,
En el control de la realización de la seguridad de subprocesos, ReentrantLock se usa más comúnmente, que puede mostrar el bloqueo y liberarlo.
Comparación de cerraduras sincronizadas y de bloqueo
- El bloqueo es un bloqueo de pantalla (abierto y cerrado manualmente, no olvide cerrar el bloqueo), sincronizado es un bloqueo implícito, que se libera automáticamente fuera del alcance
- El bloqueo solo tiene bloqueo de bloque de código, sincronizado tiene bloqueo de bloque de código y bloqueo de método
- Con Lock, la JVM pasará menos tiempo programando subprocesos y funcionará mejor. y tiene una mejor extensibilidad (proporciona una mejor subclasificación)
- orden de preferencia
- Bloquear -> bloque de código sincronizado (ha ingresado al cuerpo del método y ha asignado los recursos correspondientes) -> método sincronizado (fuera del cuerpo del método)
Implementación de bloqueo
package com.senior;
import java.util.concurrent.locks.ReentrantLock;
// Lock锁
public class TestLock {
public static void main(String[] args) {
TestLock2 t1 = new TestLock2();
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
}
}
class TestLock2 implements Runnable{
int ticketNums = 10;
// 定义lock锁
private final ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while (true){
try {
// 加锁
lock.lock();
if (ticketNums>0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(ticketNums--);
}else {
break;
}
}finally {
// 释放锁
lock.unlock();
}
}
}
}