자바 다 중 스 레 드 시 뮬 레이 션 티켓 팅 프로그램 과 스 레 드 보안 문제

자바 의 스 레 드 부분 지식 에서 티켓 팅 프로그램 은 매우 전형 적 이다.프로그램 에 도 문제 가 있 습 니 다!
수요:아 날로 그 3 개 창 에서 동시에 100 장의 표를 판매 합 니 다.
문제 1:왜 100 장 이 300 장 이 팔 렸 습 니까?
원인:tickets 는 비정 상 이기 때문에 비정 상 구성원 변수 데 이 터 는 모든 대상 에서 하나의 데 이 터 를 유지 하고 세 개의 스 레 드 대상 은 세 개 입 니 다.
솔 루 션:tickets 표 수 를 공유 하여 세 개의 스 레 드 대상 에 게 사용 합 니 다.static 수식 을 사용 합 니 다.
문제 2:스 레 드 안전 문제 가 발생 했 습 니까?
스 레 드 안전 문제 의 해결 방안:sun 은 스 레 드 동기 화 체 제 를 제공 하여 우리 로 하여 금 이런 문 제 를 해결 하 게 한다.
자바 스 레 드 동기 화 메커니즘 의 방식:
방식 1:동기 코드 블록
방식 2:동기 함수

class SellTickets extends Thread{ 
   
  static int tickets=1;//           static。            ,                          。           。 
  public SellTickets(String threadName) { 
    super(threadName); 
  } 
  public void run() { 
    while(true){ 
      synchronized (" ") { 
        if(tickets==101){//   if(tickets>100){ 
          System.out.println("      -_-..."); 
          break; 
        } 
        System.out.println(Thread.currentThread().getName()+"   "+tickets+"  "); 
        tickets++; 
        /* 
        if(tickets==101){ //   。 ticket==101 ,       。         tickets++。 
          break; 
        } 
        /* 
        if(Thread.currentThread().getName().equals("  2")){ //  2        ,     
          break; 
        } 
        */ 
      } 
      //System.out.println(Thread.currentThread().getName()+"  ..."); 
       
    } 
     
  } 
} 
 
public class Demo4 { 
   
  public static void main(String[] args) { 
    //        ,       
    SellTickets s1=new SellTickets("  1"); 
    SellTickets s2=new SellTickets("  2"); 
    SellTickets s3=new SellTickets("  3"); 
    //       
    s1.start(); 
    s2.start(); 
    s3.start(); 
     
    System.out.println("main  ..."); 
  } 
} 

좋은 웹페이지 즐겨찾기