多线程---使用synchronized---多窗口出售火车票

本文通过示例分析了在多线程环境下,使用synchronized关键字进行同步控制的问题。初始示例中,由于synchronized锁定整个对象导致效率低下,经过优化,将锁细化到减票方法substract_ticket(),提高了并发性能。同时,探讨了对象锁与类锁的区别,以及在不同场景下如何选择合适的锁策略。
摘要由CSDN通过智能技术生成
package com.ldp.demo.Thread;

public class Ticket_Synchronized {
    public static void main(String[] args) {
        Ticket_tation ticket = new Ticket_tation();
        new Thread(ticket, "a") {
        }.start();
        new Thread(ticket, "b") {
        }.start();
        new Thread(ticket, "c") {
        }.start();
        new Thread(ticket, "d") {
        }.start();
    }

}
class Ticket_tation implements Runnable {
    private int ticketNum = 10;

    @Override
    public void run() {
        while (ticketNum > 0) {   //while和synchronized 的位置不能互换,
            synchronized (this) { //要不然票会一直是同一个窗口出票
                                   //synchronized 在这里锁的是对象
              
                if (ticketNum==0){
                    System.out.println( Thread.currentThread().getName()+"出票失败,"+"票已售完!" );
                    return;
                }
                try {
                    Thread.sleep(50);//睡眠50毫秒,要不然执行太快,会是同一个窗口出票
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println((ticketNum--) + "号票已售出!" + Thread.currentThread().getName());
            }
        }

    }

}

结果

10号票已售出!a
9号票已售出!d
8号票已售出!d
7号票已售出!c
6号票已售出!b
5号票已售出!b
4号票已售出!c
3号票已售出!c
2号票已售出!c
1号票

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值