JAVA练习 请编写程序不使用任何同步技术模拟三个窗口同时卖100张票的情况运行并打印结果观察到错误的数据并解释出现错误的原因。
以下是一个可能的实现:
public class TicketSeller implements Runnable {
private int ticketCount = 100;
@Override
public void run() {
while (ticketCount > 0) {
System.out.println(Thread.currentThread().getName() + " sells ticket " + ticketCount);
ticketCount--;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
TicketSeller seller = new TicketSeller();
Thread t1 = new Thread(seller, "Window 1");
Thread t2 = new Thread(seller, "Window 2");
Thread t3 = new Thread(seller, "Window 3");
t1.start();
t2.start();
t3.start();
}
}
运行结果可能是:
Window 1 sells ticket 100
Window 2 sells ticket 99
Window 3 sells ticket 98
Window 1 sells ticket 97
...
Window 3 sells ticket 3
Window 1 sells ticket 2
Window 2 sells ticket 1
可以看到,出现了卖重、卖负的情况。原因是多个线程同时访问了共享的变量ticketCount,导致了数据不一致。例如,线程1和线程2都读取了ticketCount的值为1,然后都执行了ticketCount--操作,结果都变成了0,然后两个线程分别打印出了卖票编号1和0,导致了卖重。
为了解决这个问题,需要使用同步技术,例如使用synchronized关键字来保证一次只有一个线程可以访问ticketCount
原文地址: https://www.cveoy.top/t/topic/fqsN 著作权归作者所有。请勿转载和采集!