当前位置:课程学习>>第十章 多线程>>学习内容>>知识点三


知识点三:线程同步



同学们,请运用你学到的知识,尝试分析出现下面的提示的原因是什么,如何修改

以下是一个模拟订票业务的程序。BookingClerk类代表自动售票员,其中包含一个订票(booking)方法。假设一开始有10张票可预定。程序运行时产生两个订票客户同时自动向自动售票员订票。请问会出现什么错误?该如何修改?  

public class Test { 

  public static void main(String args[]) {

    BookingClerk bt = new BookingClerk();  

    new BookingTest(bt, 7);  

    new BookingTest(bt, 5); 

  }

}  

class BookingClerk { 

  int remainder = 10;

  void booking(int num) {  

    if (num <= remainder) {  

      System.out.println("预定" + num + "张");   

      try {    

        Thread.sleep(1000);   

      }

      catch (InterruptedException e) {        

        e.printStackTrace();   

      }   

      remainder = remainder - num;  

    } else {   

      System.out.println("剩余票不够,无法预定");  

    } System.out.println("还剩"+remainder+"票"); 

  }

}  

class BookingTest implements Runnable { 

  BookingClerk bt; 

  int num;  

  BookingTest(BookingClerk bt, int num) {  

    this.bt = bt;  

    this.num = num;  

    new Thread(this).start(); 

  }  

  public void run() {  

    bt.booking(num);  

  }

}

教师解析

本题主要考察了临界区与互斥。

错误:运行结果剩余票数出现负值。 

修改:利用关键字synchronized对booking方法同步。

通过对上述案例的学习,你是否掌握了对象锁机制的使用、等待、唤醒方法以及使用临界资源的注意事项。接下来我们进入总结与反思。