美文网首页丹辰
你知道购买车票的原理吗?Java 线程同步

你知道购买车票的原理吗?Java 线程同步

作者: 生活就是小说 | 来源:发表于2020-08-29 11:31 被阅读0次

    先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索【程序职场】关注这个执着的职场程序员。
    我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验。

    大周末的还是6点起床,起床的第一件事就是打开电脑,因为昨天下班晚,回去看了会书就休息了,本来今天是可以有一个休息时间的,结果项目出了点小意外,还要去加班,你说心塞不心塞。

    公众号的文章都是中午时间整理,晚上再编辑发布的,昨天时间太紧,就改成今天早上了。

    今天我就像聊一个小知识点,线程同步。

    废话不多说,先说概念,小伙伴先想想你的理解。

    java线程的同步有一个关键词synchronize从英译过来是 "同时发生"。但其真正的含义和字面意思截然相反。线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一个对共享资源进行操作,而不是同时进行操作。

    使用线程同步的目的:

    是让各个线程去排队使用资源,而不是让线程同时去使用资源

    概念只是让我们明白这个东西是干什么的,但是怎么做,具体怎么使用需要通过实例来说明。

    对于线程同步我们生活中就有一个很好的例子就是买车票.

    你看全国这么多人买票,不同的方式是(车站,携程,12306,代理窗口),车票肯定不是无限的,但是怎么做到让票卖出去,不会出现漏卖和空卖,怎么做到车票同步的呢?

    1, 不同步

    为了对比我们先来看看 如果 不是同步卖票  会出现什么情况?

    public class ThreadSyn implements Runnable{

        //有5张票

        int ticked = 5;

        @Override

        //重写run()方法

        public void run() {

            for(int i=ticked;i>0;i--) {

                System.out.println(Thread.currentThread().getName() + " sells " + i + " ticket");

            }

        }

        //main方法测试

        public static void main(String[] args) {

            //实例化Thread对象

            ThreadSyn tT = new ThreadSyn();

            Thread td1 = new Thread(tT,"火车站");

            Thread td2 = new Thread(tT,"携程");

            Thread td3 = new Thread(tT,"代理商");

            Thread td4 = new Thread(tT,"12306");

            //启动线程

            td1.start();

            td2.start();

            td3.start();

            td4.start();

        }

    }

    输入结果:

    火车站 sells 5 ticket

    携程 sells 5 ticket

    携程 sells 4 ticket

    火车站 sells 4 ticket

    火车站 sells 3 ticket

    火车站 sells 2 ticket

    火车站 sells 1 ticket

    携程 sells 3 ticket

    携程 sells 2 ticket

    携程 sells 1 ticket

    代理商 sells 5 ticket

    代理商 sells 4 ticket

    代理商 sells 3 ticket

    代理商 sells 2 ticket

    代理商 sells 1 ticket

    12306 sells 5 ticket

    12306 sells 4 ticket

    12306 sells 3 ticket

    12306 sells 2 ticket

    12306 sells 1 ticket

    Process finished with exit code 0

    结果优点崩溃,一共剩余5张票了,但是四个不同的方式,每一个竟然都能买到5张,这是不是有点乱了。

    所以就有了同步的概念,当A在买票的时候,B在等待,A买完以后 系统同步票数,直到C去买票的时候,发现没有票了。

    public class ThreadSyn implements Runnable{

        int ticket = 8;

        //担任"锁",锁是什么不重要,他只是一把锁

        //要求,非空对象

        private String mutex = "";

        @Override

        //重写run()方法

        public void run() {

            //while循环

            while (true) {

                synchronized (mutex) {

                    if(ticket > 0) {

                        System.out.println(Thread.currentThread().getName()+ " sells " + ticket-- + " ticket.");

                    }else {

                        break;

                    }

                }

            }

        }

        //main方法测试

        public static void main(String[] args) {

            //实例化Thread对象

            ThreadSyn tT = new ThreadSyn();

            Thread td1 = new Thread(tT,"火车站");

            Thread td2 = new Thread(tT,"携程");

            Thread td3 = new Thread(tT,"代理商");

            Thread td4 = new Thread(tT,"12306");

            //启动线程

            td1.start();

            td2.start();

            td3.start();

            td4.start();

        }

    }

    携程 sells 8 ticket.

    携程 sells 7 ticket.

    携程 sells 6 ticket.

    携程 sells 5 ticket.

    携程 sells 4 ticket.

    携程 sells 3 ticket.

    携程 sells 2 ticket.

    携程 sells 1 ticket.

    Process finished with exit code 0

    结果可以添加了同步后,只卖了现有8张票,买完为止。

    本文 Github ( 码云Gitee同步)https://github.com/ProceduralZC/JavaDevGuide/tree/master/code/JavaTheead/ThreadSynchron已收录,欢迎 star。

    我是【尔东双月】一枚执着的职场程序员,微信搜索【程序职场】关注我。别忘了三连啊,点赞、收藏、留言,随意给,我不挑。
    知乎号: 程序职场
    注:如果文章有任何问题,欢迎毫不留情地指正。

    相关文章

      网友评论

        本文标题:你知道购买车票的原理吗?Java 线程同步

        本文链接:https://www.haomeiwen.com/subject/cuwdsktx.html