14.Bloqueo

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();
            }
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_56121715/article/details/123780999
Recomendado
Clasificación