Java의 스레딩 지식 중에서 티켓 판매 프로그램은 매우 고전적입니다. 프로그램에는 몇 가지 문제가 있습니다!
요구 사항 : 3 개의 창에서 동시에 판매중인 100 장의 티켓을 시뮬레이션합니다.
질문 1 : 왜 300 개의 티켓이 판매됩니까?
이유 : 티켓은 정적이 아닌 비 정적 멤버 변수 데이터이기 때문에 각 객체에서 한 조각의 데이터가 유지되며 3 개의 스레드 객체가 있습니다.
해결책 : 3 개의 스레드 객체에 대한 티켓 번호를 공유하십시오. 정적 수정을 사용하십시오.
질문 2 : 스레드 안전 문제가 있습니까?
스레드 안전 문제에 대한 솔루션 : SUN은 이러한 유형의 문제를 해결할 수있는 스레드 동기화 메커니즘을 제공합니다.
Java 스레드를 동기화하는 방법 :
방법 1 : 코드 블록 동기화
방법 2 : 동기 기능
Class SellTickets는 스레드 {static int 티켓 = 1; // 투표 수는 여기에서 정적으로 정의되어야합니다. 그렇지 않으면 비 정적 멤버 변수 및 비 정적 멤버 변수 데이터는 각 객체에서 데이터 조각을 유지합니다. 3 개의 스레드 객체의 사본이 세 개의 사본이 있습니다. public selltickets (String ThreadName) {super (ThreadName); } public void run () {while (true) {synchronized ( "lock") {if (tickets == 101) {// 또는 if (티켓> 100) {System.out.println ( "제목은 -_-..."); 부서지다; } system.out.println (Thread.currentThread (). getName ()+""+티켓+"번호 티켓"을 판매); 티켓 ++; /* if (티켓 == 101) {// 잘못. Ticket == 101 일 때 단 하나의 스레드 만 튀어 나옵니다. 티켓 ++는 다른 두 스레드에 존재합니다. 부서지다; } /* if (thread.currentThread (). getName (). Equals ( "Window 2")) {// Window 2는 최대 하나의 티켓 만 판매 할 수 있으며 휴식은 끝났습니다. } */} //system.out.println(thread.currentThread (). getName ()+"lock ..."); }}} public class demo4 {public static void main (String [] args) {// 3 개의 스레드 객체를 생성하고 세 개의 Windows Selltickets S1 = New SellTickets ( "Window 1"); SellTickets S2 = New SellTickets ( "Window 2"); SellTickets S3 = New SellTickets ( "Window 3"); // 오픈 스레드 발권 s1.start (); s2.start (); s3.start (); System.out.println ( "메인 메소드 ..."); }}