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();
}
}
Podemos encontrar que hay dos problemas con el programa:
- El mismo número de votos, por ejemplo, el séptimo boleto se vendió dos veces.
- 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.