一个购票系统某个票的总数是一个常数,购买者可以有多个,每个购买操作都会使总数减少。

我们设计一个多线程程序


public class ThreadDemo {public static void main(String[] args) {Runnable myRunnable = new MyThread(); // 创建一个Runnable实现类的对象Thread thread1 = new Thread(myRunnable, "A");Thread thread2 = new Thread(myRunnable, "B");Thread thread3 = new Thread(myRunnable, "C");thread1.start();thread2.start();thread3.start();}
}class MyThread implements Runnable {private int ticket =10;@Overridepublic void run() {while(true){if(ticket>0){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}ticket--;System.out.println(Thread.currentThread().getName()+"卖出一张,余票"+ticket);}else {break;}}}
}

运行结果

我们竟然发现了 余票为-1 -2的情况,这就与实际不符。原因在于 多个线程同时执行同一段代码,导致变量错误

我们应对这段代码进行控制

synchronized (this){}可以将代码只有一个线程执行

public class ThreadDemo {public static void main(String[] args) {Runnable myRunnable = new MyThread(); // 创建一个Runnable实现类的对象Thread thread1 = new Thread(myRunnable, "A");Thread thread2 = new Thread(myRunnable, "B");Thread thread3 = new Thread(myRunnable, "C");thread1.start();thread2.start();thread3.start();}
}class MyThread implements Runnable {private int ticket =10;@Overridepublic void run() {while(true){synchronized (this){if(ticket>0){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}ticket--;System.out.println(Thread.currentThread().getName()+"卖出一张,余票"+ticket);}else {break;}}}}
}

执行结果,无论执行几次,余票也不会出现负数

java多线程操作同一资源相关推荐

  1. 基于Java多线程操作文件案例分享

    场景描述:某文件夹下有很多文件和文件夹,要求读取出该文件夹下的所有文件,并将文本打印输出. 案例分析:假设该文件夹下有10个文件,那么我们将所有的文件遍历一遍打印输出就可以了.但如果有100个, 10 ...

  2. java 多线程操作List,已经做了同步synchronized,还会有ConcurrentModificationException,知道为什么吗?...

    如题,最近项目里有个模块我做了异步处理方面的事情,在code过程中发现一个颠覆我对synchronized这个关键字和用法的地方,请问各位java开发者们是否对此有一个合理的解释,不多说,我直接贴出问 ...

  3. java 多线程操作map_Java 多线程中ConcurrentHashMap并发读写操作范例

    范例1: package com.contoso; import java.util.Random; import java.util.UUID; import java.util.concurren ...

  4. 实验八 java多线程操作_20182310实验八实验报告

    20182310 2019-2020 <数据结构与面向对象程序设计>实验八 树报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 周烔 学号:20182310 实验教 ...

  5. Java多线程详解[狂神说Java]

    文章目录 多线程01: 线程的生命周期 多线程02:创建线程:继承Thread类 案例:下载图片 多线程03: 创建线程:实现Runnable接口 案例:多线程操作同一资源对象 案例:龟兔赛跑 多线程 ...

  6. 图解Java多线程设计模式——Java多线程基础

    文章目录 简介 线程的启动 线程启动(1)--利用Thread类的子类 线程启动(2)--利用Runnable接口 利用ThreadFactory新启动线程 线程的暂停 线程的互斥处理 synchro ...

  7. java多线程JUC学习笔记

    JUC(java.util.concurrent) 1.1 进程/线程 1.2并发/并行 并发编程:并发.并行 并发(多线程操作同一个资源) CPI一核,模拟出来多条线程,天下武功,唯快不破,快速交替 ...

  8. java多线程高级:JUC

    文章目录 java多线程高级:JUC 1 多线程锁 1.1 传统synchronized 1.2 Lock接口 1.3 Synchronized和Lock的区别 2生产者和消费者问题 2.1 Sync ...

  9. Java多线程之线程间协作 notify与wait的使用

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 Java多线程操作运用很广,特别是在android程序方面.线程异步协作是多线程操作的难点也是关键,也 ...

最新文章

  1. MWeb for iOS 测试版介绍
  2. 李彦宏要给百度全员涨薪 连实习生都雨露均沾 :再没有行动,人都要被字节跳动给挖光了。
  3. OpenCV之gpu 模块. 使用GPU加速的计算机视觉:GPU上的相似度检测(PNSR 和 SSIM)
  4. Android可输入的下拉框,android 可编辑的下拉框 Demo
  5. matlab绘图z=sin(x_「matlab画三维图」Matlab 应用之绘制三维图形(基础篇) - seo实验室...
  6. 使用Memcached提高.NET应用程序的性能
  7. swap最大值和平均值_SWAP:Softmax加权平均池
  8. Java Web 路径问题
  9. 新加坡区块链公司Tribe Accelerator完成7000万美元融资
  10. backbonejs中的集合篇(一)
  11. Windows自带集成工具对ISO镜像是否源于官方网站的验证
  12. c15语言中不支持十六进制的数据,从十六进制字符串中提取数据
  13. 数据库中的二维表—巧借Excel
  14. Maya 界面与视图2
  15. android下运行时动态链接dlopen()和dlsym()的实现
  16. 阿德勒《被讨厌的勇气》
  17. 洛谷P2657 windy 数 数位dp
  18. 老外用批处理写的系统文件替换
  19. Flask之cookie、session、闪现
  20. 关联性图注意力网络:Relational Graph Attention Networks(ICLR2019)

热门文章

  1. C语言如何返回格式化日期时间(格式化时间)?(将日期和时间以字符串格式输出)ctime()、asctime()、localtime()、strftime()
  2. 【中级软考】MTBF是什么?(平均故障间隔时间,Mean Time Between Failure,是衡量一个产品的可靠性指标,单位为小时)
  3. 理解图像中卷积操作的含义
  4. 半编译半解释的Java语言和C++、Python等语言的区别
  5. linux文件显示程序,Linux下文件显示命令简介
  6. python 日志分析_python 日志分析统计脚本 | 学步园
  7. java将字符串和字符串数组互相转换方法
  8. javax.websocket.DeploymentException: The path [webScoketServiceBaidu/{appID}] is not valid.
  9. 在EXT中前后台传数据的方式
  10. 使用缓冲流有什么好处_使用PVC石笼网有什么好处?