java多线程实现同步锁卖票窗口案例

本文通过一个售票窗口的例子展示了Java中synchronized关键字实现线程同步的效果,对比了未使用同步锁时可能出现的线程安全问题。同时,探讨了synchronized与Lock锁的区别,强调了在多线程环境下保证数据一致性的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同步概念与方法:

 窗口类:

public class Ticket implements Runnable{
    int tickets=20;//总共20张票
    @Override
    public  void run() {
        while (tickets>0) {
            synchronized (this) {
                if(tickets>0) {
                    //售票
                    try {
                        System.out.println(Thread.currentThread().getName()+"正在售票");
                        Thread.sleep(200);//模拟售票操作时间
                        tickets--;//完成售票
                        System.out.println(Thread.currentThread().getName()+"售票完成,"+"剩余"+tickets+"张票");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

测试类:

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

        //模拟三个窗口售票
        Thread t1=new Thread(ticket);
        t1.setName("窗口1");
        t1.start();

        Thread t2=new Thread(ticket);
        t2.setName("窗口2");
        t2.start();

        Thread t3=new Thread(ticket);
        t3.setName("窗口3");
        t3.start();
    }
}

测试结果:

窗口1正在售票
窗口1售票完成,剩余19张票
窗口1正在售票
窗口1售票完成,剩余18张票
窗口1正在售票
窗口1售票完成,剩余17张票
窗口3正在售票
窗口3售票完成,剩余16张票
窗口2正在售票
窗口2售票完成,剩余15张票
窗口2正在售票
窗口2售票完成,剩余14张票
窗口2正在售票
窗口2售票完成,剩余13张票
窗口2正在售票
窗口2售票完成,剩余12张票
窗口2正在售票
窗口2售票完成,剩余11张票
窗口2正在售票
窗口2售票完成,剩余10张票
窗口2正在售票
窗口2售票完成,剩余9张票
窗口2正在售票
窗口2售票完成,剩余8张票
窗口2正在售票
窗口2售票完成,剩余7张票
窗口2正在售票
窗口2售票完成,剩余6张票
窗口2正在售票
窗口2售票完成,剩余5张票
窗口2正在售票
窗口2售票完成,剩余4张票
窗口2正在售票
窗口2售票完成,剩余3张票
窗口2正在售票
窗口2售票完成,剩余2张票
窗口2正在售票
窗口2售票完成,剩余1张票
窗口2正在售票
窗口2售票完成,剩余0张票

Process finished with exit code 0

不加同步锁测试结果:

窗口3正在售票
窗口1正在售票
窗口2正在售票
窗口1售票完成,剩余18张票
窗口1正在售票
窗口2售票完成,剩余19张票
窗口3售票完成,剩余19张票
窗口2正在售票
窗口3正在售票
窗口2售票完成,剩余16张票
窗口2正在售票
窗口1售票完成,剩余15张票
窗口3售票完成,剩余16张票
窗口1正在售票
窗口3正在售票
窗口3售票完成,剩余13张票
窗口1售票完成,剩余14张票
窗口1正在售票
窗口2售票完成,剩余12张票
窗口2正在售票
窗口3正在售票
窗口2售票完成,剩余10张票
窗口1售票完成,剩余11张票
窗口1正在售票
窗口3售票完成,剩余11张票
窗口2正在售票
窗口3正在售票
窗口2售票完成,剩余8张票
窗口1售票完成,剩余8张票
窗口3售票完成,剩余8张票
窗口1正在售票
窗口2正在售票
窗口3正在售票
窗口2售票完成,剩余5张票
窗口1售票完成,剩余5张票
窗口3售票完成,剩余7张票
窗口1正在售票
窗口2正在售票
窗口3正在售票
窗口2售票完成,剩余2张票
窗口1售票完成,剩余3张票
窗口3售票完成,剩余2张票
窗口1正在售票
窗口2正在售票
窗口3正在售票
窗口3售票完成,剩余1张票
窗口2售票完成,剩余0张票
窗口1售票完成,剩余1张票

Process finished with exit code 0

synchronized与Lock锁的区别:

Java synchronized与Lock_扶朕去网吧的博客-优快云博客_java锁synchronized与lock

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值