我们设置三个对象分别同时抢20张票,利用多线程实现.

 public class Web123506 implements Runnable{
private int ticteksNums=20;//票数 @Override
public void run() {
while (true){
if(ticteksNums<0){
break;
}
/* try {
//睡眠
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
System.out.println(Thread.currentThread().getName()+"-->抢到了"+ticteksNums--); }
} public static void main(String[] args) {
// 一份资源
Web123506 web = new Web123506();
//多个代理
new Thread(web,"我们").start();
new Thread(web,"你们").start();
new Thread(web,"黄牛党").start(); } }

运行结果为:

我们-->抢到了20
黄牛党-->抢到了18
你们-->抢到了19
黄牛党-->抢到了16
我们-->抢到了17
黄牛党-->抢到了14
你们-->抢到了15
黄牛党-->抢到了12
我们-->抢到了13
黄牛党-->抢到了10
你们-->抢到了11
黄牛党-->抢到了8
我们-->抢到了9
黄牛党-->抢到了6
你们-->抢到了7
黄牛党-->抢到了4
我们-->抢到了5
黄牛党-->抢到了2
你们-->抢到了3
黄牛党-->抢到了0
我们-->抢到了1

结论:

我们可以看到抢到的票没有重复的,说明线程是安全的.

这时候我们加入线程的睡眠.观察线程此时是不是安全的?

 public class Web123506 implements Runnable{
private int ticteksNums=20;//票数 @Override
public void run() {
while (true){
if(ticteksNums<0){
break;
}
try {
//睡眠
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-->抢到了"+ticteksNums--); }
} public static void main(String[] args) {
// 一份资源
Web123506 web = new Web123506();
//多个代理
new Thread(web,"我们").start();
new Thread(web,"你们").start();
new Thread(web,"黄牛党").start(); } }

运行结果:

黄牛党-->抢到了20
我们-->抢到了19
你们-->抢到了18
黄牛党-->抢到了17
我们-->抢到了16
你们-->抢到了15
黄牛党-->抢到了14
我们-->抢到了13
你们-->抢到了12
你们-->抢到了11
我们-->抢到了10
黄牛党-->抢到了9
你们-->抢到了8
我们-->抢到了7
黄牛党-->抢到了6
你们-->抢到了5
我们-->抢到了4
黄牛党-->抢到了3
你们-->抢到了2
我们-->抢到了1
黄牛党-->抢到了0
你们-->抢到了-1
我们-->抢到了-1

结论:

当我们加入线程的睡眠,此时抢到的票可能出现了负数或者会出现两个人抢到了同一张票此时说明加入线程睡眠线程是不安全的.

java多线程下模拟抢票的更多相关文章

  1. 进程(守护进程--互斥锁--IPC机制--生产者模型--僵尸进程与孤儿进程--模拟抢票--消息队列)

    目录 一:进程理论知识 1.理论知识 二:什么是进程? 三:僵尸进程与孤儿进程 1.僵尸进程 四:守护进程 1.什么是守护进程? 2.主进程创建守护进程 3.守护进程 五:互斥锁(模拟多人抢票) 1. ...

  2. 并发编程 - 进程 - 1.互斥锁/2.模拟抢票/3.互斥锁与join区别

    1.互斥锁: 互斥锁:Lock 原理就是把并发变成串行,一个一个运行,不错乱,但效率低 保证多个进程修改一块数据时,大家是一个一个修改,不错乱 mutex.acquire() mutex.releas ...

  3. JAVA多线程下高并发的处理经验

    java中的线程:java中,每个线程都有一个调用栈存放在线程栈之中,一个java应用总是从main()函数开始运行,被称为主线程.一旦创建一个新的线程,就会产生一个线程栈.线程总体分为:用户线程和守 ...

  4. 一个模拟——抢票部分功能的 简单版(主要实例化一下 Lock 的使用)

    """ 抢票! 多个用户在同时读写同一个数据 """ from multiprocessing import Process,Lock im ...

  5. Web Worker模拟抢票

    web worker工作原理图: 抢票系统思维导图: 思路:五个人(5个div窗口模拟)同时进行抢票,有百分之十的几率可以抢到票,抢到票后对应的窗口(即随机生成的数大于等于0小于9的情况)会编程天蓝色 ...

  6. python 并发编程 多进程 模拟抢票

    抢票是并发执行 多个进程可以访问同一个文件 多个进程共享同一文件,我们可以把文件当数据库,用多个进程模拟多个人执行抢票任务 db.txt {"count": 1} 并发运行,效率高 ...

  7. 《安卓网络编程》之第一篇 java环境下模拟客户端、服务器端

    1.Socket简介 在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个 ...

  8. 多线程(模拟买票)-----java基础知识总结

    这次的的问题引入的比较深入,如果看了这篇博客,不看下一篇,你会很懵逼. 代码: package com.day13.math; /** * 类说明 :模拟三个窗口同时售票 * @author 作者 : ...

  9. Java 多线程下的单例模式

    单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.正是由于这个特 点,单例对象通常作为程序中的存放配置信息的载体,因为它能保证 ...

随机推荐

  1. tyvj——P3524 最大半连通子图

    P3524 最大半连通子图 时间: 3000ms / 空间: 165536KiB / Java类名: Main 描述 输入格式 第一行包含两个整数N,M,X.N,M分别表示图G的点数与边数,X的意义如 ...

  2. Partition List(链表的插入和删除操作,找前驱节点)

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  3. vmware下centos6.7网络配置

    使用NAT方式: 查看/etc/sysconfig/network-script/ 下面没有ifcfg-eth0 新建ifcfg-eth0,内容如下 DEVICE=eth0 BOOTPROTO=dhc ...

  4. (转)Delphi2009初体验 - 语言篇 - 智能指针(Smart Pointer)的实现

     转载:http://www.cnblogs.com/felixYeou/archive/2008/08/27/1277250.html 快速导航 一. 回顾历史二. 智能指针简介三. Delphi中 ...

  5. grails的criteria和hql查询

    grails在查询方面也保留了hibernate的hql和criteria查询功能.hql自然不必多说基本不会有什么变化,grails的criteria查询在hibernate上面做了微调使用起来更加 ...

  6. VC++ 2010编译错误 fatal error C1189 error This file requires _WIN32_WINNT to be #defined at least

    打开你的C++工程,找到里面的stdafx.h文件,然后把下面的红色内容替换成绿色的 参考:http://blog.csdn.net/dongliqiang2006/article/details/5 ...

  7. 微信小程序 常见问题 小结

    1.微信小程序 尺寸单位 rpx单位是微信小程序中css的尺寸单位,rpx可以根据屏幕宽度进行自适应.规定屏幕宽为750rpx.如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则 ...

  8. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  9. Django:视图和URL配置

    一.视图      1.在mysite文件夹下.创建views.py文件(文件名称没有特别的要求): from django.http import HttpResponse def hello(re ...

  10. shutdown abort模式丢失redo,使用隐含參数启库

    shutdown abort模式 丢失redo log 无法open数据库 通过告警报错ORA-00354: corrupt redo log block header 从该错误能够看出当前日志的re ...