java多线程操作同一资源
一个购票系统某个票的总数是一个常数,购买者可以有多个,每个购买操作都会使总数减少。
我们设计一个多线程程序
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多线程操作同一资源相关推荐
- 基于Java多线程操作文件案例分享
场景描述:某文件夹下有很多文件和文件夹,要求读取出该文件夹下的所有文件,并将文本打印输出. 案例分析:假设该文件夹下有10个文件,那么我们将所有的文件遍历一遍打印输出就可以了.但如果有100个, 10 ...
- java 多线程操作List,已经做了同步synchronized,还会有ConcurrentModificationException,知道为什么吗?...
如题,最近项目里有个模块我做了异步处理方面的事情,在code过程中发现一个颠覆我对synchronized这个关键字和用法的地方,请问各位java开发者们是否对此有一个合理的解释,不多说,我直接贴出问 ...
- java 多线程操作map_Java 多线程中ConcurrentHashMap并发读写操作范例
范例1: package com.contoso; import java.util.Random; import java.util.UUID; import java.util.concurren ...
- 实验八 java多线程操作_20182310实验八实验报告
20182310 2019-2020 <数据结构与面向对象程序设计>实验八 树报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 周烔 学号:20182310 实验教 ...
- Java多线程详解[狂神说Java]
文章目录 多线程01: 线程的生命周期 多线程02:创建线程:继承Thread类 案例:下载图片 多线程03: 创建线程:实现Runnable接口 案例:多线程操作同一资源对象 案例:龟兔赛跑 多线程 ...
- 图解Java多线程设计模式——Java多线程基础
文章目录 简介 线程的启动 线程启动(1)--利用Thread类的子类 线程启动(2)--利用Runnable接口 利用ThreadFactory新启动线程 线程的暂停 线程的互斥处理 synchro ...
- java多线程JUC学习笔记
JUC(java.util.concurrent) 1.1 进程/线程 1.2并发/并行 并发编程:并发.并行 并发(多线程操作同一个资源) CPI一核,模拟出来多条线程,天下武功,唯快不破,快速交替 ...
- java多线程高级:JUC
文章目录 java多线程高级:JUC 1 多线程锁 1.1 传统synchronized 1.2 Lock接口 1.3 Synchronized和Lock的区别 2生产者和消费者问题 2.1 Sync ...
- Java多线程之线程间协作 notify与wait的使用
(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 Java多线程操作运用很广,特别是在android程序方面.线程异步协作是多线程操作的难点也是关键,也 ...
最新文章
- MWeb for iOS 测试版介绍
- 李彦宏要给百度全员涨薪 连实习生都雨露均沾 :再没有行动,人都要被字节跳动给挖光了。
- OpenCV之gpu 模块. 使用GPU加速的计算机视觉:GPU上的相似度检测(PNSR 和 SSIM)
- Android可输入的下拉框,android 可编辑的下拉框 Demo
- matlab绘图z=sin(x_「matlab画三维图」Matlab 应用之绘制三维图形(基础篇) - seo实验室...
- 使用Memcached提高.NET应用程序的性能
- swap最大值和平均值_SWAP:Softmax加权平均池
- Java Web 路径问题
- 新加坡区块链公司Tribe Accelerator完成7000万美元融资
- backbonejs中的集合篇(一)
- Windows自带集成工具对ISO镜像是否源于官方网站的验证
- c15语言中不支持十六进制的数据,从十六进制字符串中提取数据
- 数据库中的二维表—巧借Excel
- Maya 界面与视图2
- android下运行时动态链接dlopen()和dlsym()的实现
- 阿德勒《被讨厌的勇气》
- 洛谷P2657 windy 数 数位dp
- 老外用批处理写的系统文件替换
- Flask之cookie、session、闪现
- 关联性图注意力网络:Relational Graph Attention Networks(ICLR2019)
热门文章
- C语言如何返回格式化日期时间(格式化时间)?(将日期和时间以字符串格式输出)ctime()、asctime()、localtime()、strftime()
- 【中级软考】MTBF是什么?(平均故障间隔时间,Mean Time Between Failure,是衡量一个产品的可靠性指标,单位为小时)
- 理解图像中卷积操作的含义
- 半编译半解释的Java语言和C++、Python等语言的区别
- linux文件显示程序,Linux下文件显示命令简介
- python 日志分析_python 日志分析统计脚本 | 学步园
- java将字符串和字符串数组互相转换方法
- javax.websocket.DeploymentException: The path [webScoketServiceBaidu/{appID}] is not valid.
- 在EXT中前后台传数据的方式
- 使用缓冲流有什么好处_使用PVC石笼网有什么好处?