0
点赞
收藏
分享

微信扫一扫

java多线程经典案列(卖票)

悄然丝语 2022-05-01 阅读 90
java
public class Ticket implements Runnable {


    private int ticket = 100;


    @Override
    public void run() {
        while (true) {
            if (ticket > 0) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "卖了一张票,剩下:" + ticket--);
            }
        }
    }


    public static void main(String[] args) {
        Ticket ticket = new Ticket();

        Thread t1 = new Thread(ticket, "窗口1");
        Thread t2 = new Thread(ticket, "窗口2");
        Thread t3 = new Thread(ticket, "窗口3");

        t1.start();
        t2.start();
        t3.start();

    }
}

此时会出现线程安全问题,可以加锁解决此问题

public class Ticket implements Runnable {

    private int ticket = 100;
    Object object = new Object();

    @Override
    public void run() {
        while (true) {
            if (ticket > 0) {
                synchronized (this) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "卖了一张票,剩下:" + ticket--);
                }
            }
        }
    }

    public static void main(String[] args) {
        Ticket ticket = new Ticket();

        Thread t1 = new Thread(ticket, "窗口1");
        Thread t2 = new Thread(ticket, "窗口2");
        Thread t3 = new Thread(ticket, "窗口3");

        t1.start();
        t2.start();
        t3.start();

    }
}

 

 还是出现了线程安全问题,这是为什么呢?

举报

相关推荐

0 条评论