Entre os conhecimentos de encadeamento em Java, os programas de vendas de ingressos são muito clássicos. Também existem alguns problemas no programa!
Requisitos: simule 100 ingressos à venda ao mesmo tempo em 3 janelas.
Pergunta 1: Por que 300 ingressos são vendidos?
Motivo: como os tickets não são estáticos, os dados variáveis não estáticos manterão uma parte de dados em cada objeto e haverá três peças de três objetos de thread.
Solução: compartilhe o número dos tickets para três objetos de thread. Use modificação estática.
Pergunta 2: Existe um problema de segurança de threads?
Solução para problemas de segurança: O Sun fornece um mecanismo de sincronização de rosca para resolvermos esse tipo de problema.
Como sincronizar os threads java:
Método 1: Sincronizar blocos de código
Método 2: Função Síncrona
classe SellTickets estende thread {static int tickets = 1; // O número de votos deve ser definido como estático aqui. Caso contrário, variáveis não estáticas de membros e dados variáveis de membros não estáticos manterão uma parte de dados em cada objeto. Haverá três cópias de três objetos de thread. public SellTickets (string threadName) {super (threadName); } public void run () {while (true) {synchronized ("Lock") {if (tickets == 101) {// ou if (tickets> 100) {System.out.println ("Os títulos foram vendidos --_-_-..."); quebrar; } System.out.println (thread.currentThread (). GetName ()+"vendeu os tickets"+"ticket" número "); ingressos ++; /* if (tickets == 101) {// errado. Quando o ticket == 101, apenas um fio salta. Os ingressos ++ existem nos outros dois threads. quebrar; } /* if (thread.currentThread (). getName (). Equals ("Window 2")) {// A janela 2 pode vender apenas no máximo um bilhete, e o intervalo acabou; } */} //System.out.println(thread.currentThread (). GetName ()+"Lock ..."); }}} classe pública Demo4 {public static void main (string [] args) {// Crie três objetos de thread e simule três windows SellTickets s1 = new SellTickets ("Window 1"); SellTickets S2 = New SellTickets ("Window 2"); SellTickets S3 = New SellTickets ("Window 3"); // Abra o thread Ticketing S1.start (); s2.start (); s3.start (); System.out.println ("Método principal ..."); }}