Entre los conocimientos de enhebrado en Java, los programas de venta de entradas son muy clásicos. ¡También hay algunos problemas en el programa!
Requisitos: Simule 100 boletos a la venta al mismo tiempo en 3 ventanas.
Pregunta 1: ¿Por qué se venden 300 boletos?
Razón: Debido a que los boletos no son estatales, los datos variables de miembros no estáticos mantendrán una pieza de datos en cada objeto, y habrá tres piezas de tres objetos de hilo.
Solución: comparta el número de tickets para tres objetos de hilo. Use modificación estática.
Pregunta 2: ¿Existe un problema de seguridad de hilo?
Solución a problemas de seguridad del hilo: Sun proporciona un mecanismo de sincronización de subprocesos para que podamos resolver este tipo de problema.
Cómo sincronizar los hilos de Java:
Método 1: Sincronizar bloques de código
Método 2: función sincrónica
La clase SellTickets extiende el hilo {tickets static int = 1; // El número de votos debe definirse como estático aquí. De lo contrario, las variables de miembros no estatales y los datos de variables miembros no estatales mantendrán un dato en cada objeto. Habrá tres copias de tres objetos de hilo. public sellTickets (String ThreadName) {super (ThreadName); } public void run () {while (true) {sincronizado ("bloqueo") {if (tickets == 101) {// o if (tickets> 100) {system.out.println ("se han agotado -_-..."); romper; } System.out.println (Thread.CurrentThread (). GetName ()+"vendió el"+boletos "Ticket de número"); entradas ++; /* if (tickets == 101) {// Incorrecto. Cuando Ticket == 101, solo un hilo salta. Las entradas ++ existe en los otros dos hilos. romper; } /* if (thread.currentThread (). getName (). Equals ("Window 2")) {// La ventana 2 solo puede vender como máximo un boleto, y el descanso ha terminado; } */} //System.out.println(thread.currentThread (). GetName ()+"bloqueo ..."); }}} public class Demo4 {public static void main (string [] args) {// crea tres objetos de subprocesos y simula tres Windows sellTickets S1 = new SellTickets ("Window 1"); SellTickets S2 = new SellTickets ("Ventana 2"); SellTickets S3 = new SellTickets ("Ventana 3"); // abre boletos de hilo S1.Start (); s2.start (); s3.Start (); System.out.println ("Método principal ..."); }}