以下是一个可能的程序实现:

public class TicketSeller implements Runnable {
    private int tickets = 100;

    @Override
    public void run() {
        while (tickets > 0) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + ' sells ticket ' + tickets--);
        }
    }

    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();
    }
}

这个程序创建了一个 TicketSeller 类,表示售票员,实现了 Runnable 接口并重写了 run 方法,表示在卖票过程中的行为。每个售票员都有自己的线程,通过 Thread 类来创建并分别启动。

程序输出的结果可能类似于这样:

Window 1 sells ticket 100
Window 2 sells ticket 99
Window 3 sells ticket 98
Window 2 sells ticket 97
Window 1 sells ticket 96
Window 3 sells ticket 95
...

但是,由于没有使用同步技术,多个线程同时对 tickets 变量进行读写,就会出现错误的数据。比如一个线程读到了 tickets 的值为 1,但还没来得及减一,另一个线程也读到了同样的值,并且减了一,这样就会出现卖出两张甚至更多的票的情况。

解决这个问题的方法是使用同步技术,比如 synchronized 关键字或者 Lock 接口等,保证多个线程在访问共享资源时的互斥性。

Java 多线程售票模拟:线程安全问题及解决方案

原文地址: https://www.cveoy.top/t/topic/ofbR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录