现有一个在线售票系统,总共有200张票,假设4个线程同时订票,网络传输延时为5毫秒,试编写程序模拟12306的售票过程。 试用synchronized函数,加入同步机制。
时间: 2024-03-07 21:48:56 浏览: 143
好的,我可以帮你回答这个问题。
首先,我们需要定义一个共享资源,即200张票的数量,这个数量需要被4个线程同时访问和修改,因此需要使用synchronized函数来保证线程安全。
下面是一个简单的Java代码实现:
```
public class TicketSystem {
private static int ticketNum = 200;
public synchronized static boolean buyTicket(int num) {
if (ticketNum >= num) {
ticketNum -= num;
System.out.println("成功购买" + num + "张票,剩余票数:" + ticketNum);
return true;
} else {
System.out.println("购买" + num + "张票失败,剩余票数:" + ticketNum);
return false;
}
}
}
public class ThreadDemo extends Thread {
private int ticketNum;
public ThreadDemo(int ticketNum) {
this.ticketNum = ticketNum;
}
public void run() {
try {
sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
TicketSystem.buyTicket(ticketNum);
}
}
public class Main {
public static void main(String[] args) {
ThreadDemo t1 = new ThreadDemo(50);
ThreadDemo t2 = new ThreadDemo(50);
ThreadDemo t3 = new ThreadDemo(50);
ThreadDemo t4 = new ThreadDemo(50);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
```
在这个代码中,TicketSystem类定义了一个共享资源ticketNum,并使用synchronized函数来保证线程安全。buyTicket函数用于购买票,每次购买需要传入购买的数量num,如果剩余票数足够,则减去相应数量的票,并返回true,否则返回false。
ThreadDemo类继承自Thread类,重写了run函数,在run函数中调用TicketSystem的buyTicket函数来购买票。
Main类创建了4个ThreadDemo实例,分别购买50张票。
在执行这个程序时,由于synchronized函数的保证,4个线程将会按顺序访问和修改ticketNum的值,从而保证线程安全。同时,sleep(5)函数模拟了网络传输延时,这也是实际情况中需要考虑的因素。
希望这个代码能够帮助你理解synchronized函数的使用和线程安全的实现。
阅读全文