synchronized (lock) 买票demo 线程安全

加锁防止多个线程执行同一段代码!

/** http://blog.51cto.com/wyait/1916898
 * @author
 * @since 11/10/2018
 * 某电影院目前正在上映贺岁大片,共有100张票,而它有3个售票窗口售票,请设计一个程序模拟该电影院售票.
 * 同步的特点:
 *      前提: 多个线程
 *      解决问题的时候要注意: 多个线程使用的是同一个锁对象
 * 同步的好处:同步的出现解决了多线程的安全问题。
 * 同步的弊端:当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。
 */
public class SellTicketDemo {

    public static void main(String[] args) {
        SellTicket st = new SellTicket();//创建资源对象
        //创建三个线程对象
        new Thread(st, "窗口1").start();
        new Thread(st, "窗口2").start();
        new Thread(st, "窗口3").start();
    }

    public static class SellTicket implements Runnable {
        private int tickets = 10;//定义100张票
        private Object lock = new Object();//定义同一把锁
        @Override
        public void run() {
            while (true) {
                //t1,t2,t3都能走到这里
                //假设t1抢到CPU的执行权,t1就要进来
                //假设t2抢到CPU的执行权,t2就要进来,发现门是关着的,进不去。所以就等着。

                //门锁(开,关)
                synchronized (lock) { // 发现这里的代码将来是会被锁上的,所以t1进来后,就锁了。(关)
                    if (tickets > 0) {
                        try {
                            Thread.sleep(100);// t1就睡眠了
                            // 添加:每次卖票延迟100毫秒!
                            //不加锁会 出现问题:相同的票出现多次,还出现了负数的票
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(
                                Thread.currentThread().getName() + "正在出售第" + (tickets--) + "张票 ");
                        //窗口1正在出售第100张票
                    }
                }//t1就出来可,然后就开门。(开)
            }
        }
    }

}

http://blog.51cto.com/wyait/1916898

原文地址:https://www.cnblogs.com/hahajava/p/9773581.html

时间: 10-11

synchronized (lock) 买票demo 线程安全的相关文章

编程之美之买票找零

题目:假设有2N个人在排队买票,其中有N个人手持50元的钞票,另外有N个人手持100元的钞票,假设开始售票时,售票处没有零钱,问这2N个人有多少种排队方式,不至使售票处出现找不开钱的局面? 分析:队伍的序号标为0,1,...,2n-1,并把50元看作左括号,100元看作右括号,合法序列即括号能完成配对的序列.对于一个合法的序列,第0个一定是左括号,它必然与某个右括号配对,记其位置为k.那么从1到k-1.k+1到2n-1也分别是两个合法序列.那么,k必然是奇数(1到k-1一共有偶数个),设k=2i

[BOP][Beauty of Programming][MSRA] 从“买票问题”谈起

问题(买票问题): 在一场激烈的足球赛开始前,售票工作正在紧张地进行中. 已知: 1.每张球票为50元. 2.现在有2n个人排队购票, 其中有n个人手持50元钞票,另外n个人手持100元钞票, 假设开始售票时,售票处没有零钱. 问:这2n个人有多少种排队方式,不至使售票处出现找不开钱的局面? 摘要: 通过对买票找零问题的分析,迁移到括号匹配问题,得到递推式.并通过数学分析中级数幂级数知识,推导出递推式的通项,以此解决部分衍生问题. 这里符号怎么玩…… 见外链吧 http://yunpan.cn/

电影院买票问题->排队找钱

问题:有2n个人排队进电影院,票价是50美分.在这2n个人当中,其中n个人只有50美分,另外n个人有1美元(纸票子).愚蠢的电影院开始卖票时1分钱也没有.问:有多少种排队方法使得每当一个拥有1美元买票时,电影院都有50美分找钱 注:1美元=100美分拥有1美元的人,拥有的是纸币,没法破成2个50美分 解析:符合卡特兰数( Catalan数),因此直接可以得出答案:(2n)/(n!*(n+1)!). Catalan数相关:令h(0)=1,h(1)=1: 1.catalan数满足递推式: h(n)=

13 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件  queue队列 生产者消费者模型 Queue队列 开发一个线程池

本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把

【转载】Java中的锁机制 synchronized & Lock

参考文章: http://blog.csdn.net/chen77716/article/details/6618779 目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理. 数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的

窗口卖票的线程解决方案

1 public class SellTicket implements Runnable { 2 // 定义100张票 3 private int tickets = 100; 4 //创建锁对象 5 private Object obj = new Object(); 6 7 @Override 8 public void run() { 9 while (true) { 10 synchronized (obj) { 11 if (tickets > 0) { 12 try { 13 Th

43_2013年11月22日 线程池 Socket(Thread Lock Process 摇奖 线程池ThreadPool)

1>模拟线程池,生产者消费者问题 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Product { class Program { static void Main(string[] args) { //创建一个池子 MyConncetion[]

四大航企相继取消机票代理费 未来买票或要付服务费

对于普通旅客而言,代理费取消后,所得到的服务和所需花费的票价才是他们关注重点.民航专家.中国航空运输协会专家委员綦琦表示,未来旅客或将享受到来自机票分销渠道的代理人更多的服务,但这部分将有可能要收费. 四大航企相继取消机票代理费,谁是新规则下的赢家和输家? 未来买机票或要付服务费 继南航和厦航之后,6月10日,国航和东航也正式取消机票代理费.在不到1年的时间里,国内几大航空公司纷纷将代理费从3%分别下调至2%.1%和0%,其他航空公司或将紧随其后. 为何航空公司要取消代理费?代理费取消后,航空公

[HZNUOJ1524]排队买票(DP)

题目链接:http://acm.hznu.edu.cn/JudgeOnline/problem.php?id=1524 简单分析后可以知道每一个手持两元的小朋友前面,售票员手里至少有一个一元. 假设dp(i, j)表示当有i个1元和j个2元的时候的排队方法(不重复),那么有: dp(i, j)=∑k[0, j]dp(i-1, k), (i >= j) 题干讲n个人和k个人内部不同位置也算新的排列方法.那么最后要乘上A(k,k)*A(n,n) 1 #include <algorithm>

C++进程间通信(常用理解例子)-买票

#include "stdafx.h" #include <iostream>using namespace std; #include "windows.h" int index = 0;int tickets = 100;HANDLE hMutex = NULL; //互斥HANDLE hEvent = NULL; //事件 CRITICAL_SECTION g_cs ; //临界区 DWORD WINAPI Func1(LPVOID pParam)