Concepto de seguridad de subprocesos de aprendizaje de Java (simulación de caso de ticket de venta)

A salvo de amenazas

Si hay varios subprocesos ejecutándose al mismo tiempo, y estos subprocesos pueden ejecutar este código al mismo tiempo, el resultado de cada ejecución del programa es el mismo que el resultado de una única ejecución de subproceso, y los valores de otras variables son los mismos que los esperados, es decir A salvo de amenazas. Es decir, cuando varios subprocesos acceden a una determinada clase (objeto), esta clase siempre puede mostrar el comportamiento correcto.

El caso de venta de entradas simula el problema de seguridad del hilo
[Descripción del caso] El cine quiere vender entradas, simulamos el proceso de venta de entradas del cine. Suponiendo que la película que se va a reproducir es "Wolf Warrior 3", hay 100 asientos en esta película (la película solo puede vender 100 boletos). Simulemos la ventanilla de venta de entradas del cine y nos demos cuenta de que varias ventanillas pueden vender entradas para "Calabash Baby vs. Ultraman" al mismo tiempo (varias ventanas venden estas 100 entradas juntas). Se necesita la ventana y el objeto de hilo se usa para simular; se necesita boleto, Ejecutable Subclase de interfaz para simular.

Demostración del programa :

public class RunnableImpl implements Runnable{
    
    

    //定义一个多线程共享的票源
    private int ticket = 100;

    //设置线程任务:卖票
    @Override
    public void run() {
    
    
        while (true) {
    
    
            //先判断票是否存在
            if(ticket > 0) {
    
    
                //票存在,卖票 ticket--
                //提高安全问题出现的概率,让程序睡眠
                try {
    
    
                    Thread.sleep(100);
                } catch (InterruptedException e) {
    
    
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+ "-->正在,卖第"+ ticket + "张票");
                ticket--;
            }
        }
    }
}
/*
    模拟卖票案例
    创建3个线程,同时开启,对共享的票进行出售
*/
public class Demo01Ticket {
    
    

    public static void main(String[] args) {
    
    
        //创建Runnable接口的实现类对象
        Runnable run = new RunnableImpl();//多态
        //创建Thread类对象,构造方法中传递Runnable接口的实现类对象
        Thread t0 = new Thread(run);
        Thread t1 = new Thread(run);
        Thread t2 = new Thread(run);

        //调用start方法开启多线程
        t0.start();
        t1.start();
        t2.start();
    }
}

Inserte la descripción de la imagen aquí
Podemos encontrar que hay dos problemas con el programa:

  1. El mismo número de votos, por ejemplo, el séptimo boleto se vendió dos veces.
  2. Votos inexistentes, como 0 votos y -1 votos, no existen.

Este tipo de problema, el número de votos de varias ventanas (hilos) no están sincronizados, lo que se denomina inseguridad del hilo.


Los problemas de seguridad de subprocesos son causados ​​por variables globales y variables estáticas. Si cada subproceso solo tiene operaciones de lectura en variables globales y variables estáticas, pero no operaciones de escritura, en general, esta variable global es segura para subprocesos; si varios subprocesos realizan operaciones de escritura al mismo tiempo, generalmente se debe considerar la sincronización de subprocesos; de lo contrario Puede afectar la seguridad de los hilos.

Supongo que te gusta

Origin blog.csdn.net/weixin_44664432/article/details/106728083
Recomendado
Clasificación