El servicio de ticketing de subprocesos múltiples utiliza el bloqueo de bloqueo

Bloquear

Hay un problema de seguridad de subprocesos en el caso de venta de entradas (venta de entradas inexistentes y entradas duplicadas). La
tercera solución es usar Lock para implementar
java.util.concurrent.locks
Lock para proporcionar más que el uso de métodos y declaraciones sincronizados. Amplia operación de bloqueo.
Permiten una estructuración más flexible, pueden tener propiedades completamente diferentes y pueden admitir múltiples condiciones de objeto asociadas.
Métodos en la interfaz de bloqueo:

  • anular bloqueo () adquirir bloqueo
  • Desbloqueo vacío () suelta el bloqueo

Pasos para usar java.util.concurrent.locks.ReentrantLock implementa la interfaz de bloqueo
:

  • 1. Cree un objeto Reentrantlock en la ubicación del miembro
  • 2. Llame al método Lock en la interfaz de Lock para obtener el bloqueo antes del código que puede tener problemas de seguridad
  • 3. Después del código que puede tener problemas de seguridad, llame al método Desbloquear en la interfaz de bloqueo para liberar el bloqueo.

Código de venta de entradas

public class RunnableImpl implements Runnable {
private int ticket=100;
//在成员位置创建一个Reentrantlock对象
Lock l= new ReentrantLock();

@Override
public void run() {
    while (true)
    {
        l.lock();
        if(ticket>0)
        {
            try {
                Thread.sleep(10);
                System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket+"张票!");
                ticket--;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                //在可能会出现安全问题的代码后面调用Lock接口中的方法Unlock释放锁
                l.unlock();//无论程序是否异常,都会把锁释放!
            }

        }

    }

}
}

Código de prueba:

public class Demo01Ticket {
public static void main(String[] args) {
    RunnableImpl run=new RunnableImpl();
    Thread t0=new Thread(run);
    Thread t1=new Thread(run);
    Thread t2=new Thread(run);
    //调用start,开启多线程
    t0.start();
    t1.start();
    t2.start();
}
}

Efecto de realización:

¡Thread-0 está vendiendo su boleto número 100!
¡Thread-0 está vendiendo el boleto 99!
¡Thread-0 está vendiendo su boleto 98!
¡Thread-0 está vendiendo su entrada número 97!
¡Thread-0 está vendiendo su boleto 96!
¡Thread-0 está vendiendo su entrada número 95!
¡Thread-0 está vendiendo su boleto 94!

Supongo que te gusta

Origin blog.csdn.net/tangshuai96/article/details/102631352
Recomendado
Clasificación