java多线程下模拟抢票

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

 1 public class Web123506 implements Runnable{
 2   private int ticteksNums=20;//票数
 3
 4     @Override
 5     public void run() {
 6      while (true){
 7          if(ticteksNums<0){
 8              break;
 9          }
10         /* try {
11              //睡眠
12              Thread.sleep(200);
13          } catch (InterruptedException e) {
14              e.printStackTrace();
15          }*/
16          System.out.println(Thread.currentThread().getName()+"-->抢到了"+ticteksNums--);
17
18      }
19     }
20
21     public static void main(String[] args) {
22            // 一份资源
23         Web123506 web = new Web123506();
24         //多个代理
25         new Thread(web,"我们").start();
26         new Thread(web,"你们").start();
27         new Thread(web,"黄牛党").start();
28
29     }
30
31 }

运行结果为:

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

结论:

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

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

 1 public class Web123506 implements Runnable{
 2   private int ticteksNums=20;//票数
 3
 4     @Override
 5     public void run() {
 6      while (true){
 7          if(ticteksNums<0){
 8              break;
 9          }
10          try {
11              //睡眠
12              Thread.sleep(200);
13          } catch (InterruptedException e) {
14              e.printStackTrace();
15          }
16          System.out.println(Thread.currentThread().getName()+"-->抢到了"+ticteksNums--);
17
18      }
19     }
20
21     public static void main(String[] args) {
22            // 一份资源
23         Web123506 web = new Web123506();
24         //多个代理
25         new Thread(web,"我们").start();
26         new Thread(web,"你们").start();
27         new Thread(web,"黄牛党").start();
28
29     }
30
31 }

运行结果:

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

结论:

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

原文地址:https://www.cnblogs.com/xiaoqiqistudy/p/10984265.html

时间: 2024-10-04 00:28:55

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

java多线程下如何调用一个共同的内存单元(调用同一个对象)

1 /* 2 * 关于线程下共享相同的内存单元(包括代码与数据) 3 * ,并利用这些共享单元来实现数据交换,实时通信与必要的同步操作. 4 * 对于Thread(Runnable target)构造方法创建的线程,轮到它来享用CPU资源时. 5 * 目标对象就会自动调用接口中的run()方法 6 * */ 7 8 /* ----------------举例子------------------- */ 9 10 /* 11 * 使用Thread类创建两个模拟猫和狗的线程,猫和狗共享房屋中的一桶

java多线程下的所的概念

锁和synchronized关键字     为了同步多线程,Java语言使用监视器(monitors),一种高级的机制来限定某一 时刻只有一个线程执行一段受监视器保护的代码.监视器的行为是通过锁来实现的,每一个对象都有一个锁.    每个线程都有一个工作内存,在里面存放从所有线程共享的主内存里拷贝来的变量.为了访问一个共享的变量,一个线程通常先要获得一个锁并刷新它的工作内存,这将共享的值从主内存被拷贝到工作内存.当线程解锁时将会把工作内存里的值写回主内存.&n bsp;   一个线程能多次获得对

守护进程,模拟抢票例子,互斥锁,信号量,队列总结

 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children 注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止 # 守护进程 from multiprocessing import Process import os,time,random def task(): print('%s

python—day29 守护进程、互斥锁、模拟抢票、IPC通信机制、生产者消费者模型

1.守护进程: 什么是守护进程,假如你是皇帝,每日每夜守护你的就是太监,守护进程就相当于太监,当皇帝驾崩后太监也需要陪葬,所以守护进程当父进程销毁时就一起销毁: 1 from multiprocessing import Process 2 3 import time 4 5 def task(name): 6 7 time.sleep(0.5) 8 print('%s' %name) 9 10 11 if __name__ == '__main__': 12 p = Process(targe

[Java] 多线程下生产者消费者问题的五种同步方法实现

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题. 生产者消费者模式的优点 - 解耦 - 支持并发 - 支持忙闲不均 解决方法可分为两类: (1)用信号量和锁机制实现生产者和消费者之间的同步: - wait() / notify()方法 - await() / signal()方法 - BlockingQueue阻塞队列方法 - Semaphore方法 (2)在生产者和消费者之间建立一个管道.(一般不使用,缓冲区不易控制.数据不易封装和传输) - PipedInputStream

基于selenium+java的12306自动抢票

import java.util.concurrent.TimeUnit; import org.openqa.selenium.By;import org.openqa.selenium.Keys;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.i

Java多线程(三)模拟龟兔赛跑

用Runnable接口实现多线程 public class ThreadDemo { public static void main(String[] args) throws InterruptedException { Racer racer = new Racer(); new Thread(racer, "乌龟").start(); new Thread(racer, "兔子").start(); } } class Racer implements Run

JAVA多线程下,获取递增的序列号

场景描述: 1,目前我们的系统可以简单归纳成MVC的架构模式 2,每个前端的请求过来,都会在C层开启事务,最后处理结束后,也在在C层关闭事务(实际是在C层的底层统一做了事务的开启和提交):        问题描述:        有一个接口方法,用于获取数据库中的序列号,然后+1再保存到数据库. 客户的报障是:并发情况下出现了单号重复,也就是多个线程同时取到了相同的序列号,而不是等到上一个线程将序列号+1后的值. 问题分析:        初步分析,存在两个问题: 1,方法的锁不起作用 2,序列

用开启线程的方式模拟抢票实现并加线程锁

# -*- coding: utf-8 -*- """ 主线程要等到所有非守护线程结束,才能结束. db.json----->{"count":1} """ import json from threading import Thread, Lock import time def search(name): with open('db.json', 'rt', encoding='utf-8') as f: dic =