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
synchronized (lock) 买票demo 线程安全的更多相关文章
- java 多线程之synchronized wait/notify解决买票问题
一.Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的st ...
- 【Java】学习路径49-练习:使用两个不同的线程类实现买票系统
练习:使用两个不同的线程类实现买票系统 请创建两个不同的线程类.一个测试类以及一个票的管理类. 其中票的管理类用于储存票的数量.两个线程类看作不同的买票方式. 步骤: 1.创建所需的类 App售票线程 ...
- Java 数量为5的线程池同时运行5个窗口买票,每隔一秒钟卖一张票
/** * 1.创建线程数量为5的线程池 * 2.同时运行5个买票窗口 * 3.总票数为100,每隔一秒钟卖一张票 * @author Administrator * */ public class ...
- Java线程同步(synchronized)——卖票问题
卖票问题通常被用来举例说明线程同步问题,在Java中,采用关键字synchronized关键字来解决线程同步的问题. Java任意类型的对象都有一个标志位,该标志位具有0,1两种状态,其开始状态为1, ...
- 除了Synchronized关键字还有什么可以保证线程安全?
除了Synchronized关键字还有什么可以保证线程安全? 日常使用Java开发时,多线程开发,一般就用Synchronized保证线程安全,防止并发出现的错误和异常,那么 除了Synchr ...
- 【Java面试题】26 多线程有几种实现方法?同步有几种实现方法? 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
问题一:多线程有几种实现方法?同步有几种实现方法? 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与not ...
- JMM内存模型+volatile+synchronized+lock
硬件内存模型: Java内存模型: 每个线程都有一个工作内存,线程只可以修改自己工作内存中的数据,然后再同步回主内存,主内存由多个内存共享. 下面 8 个操作都是原子的,不可再分的: 1) lock ...
- Java中的线程--Lock和Condition实现线程同步通信
随着学习的深入,我接触了更多之前没有接触到的知识,对线程间的同步通信有了更多的认识,之前已经学习过synchronized 实现线程间同步通信,今天来学习更多的--Lock,GO!!! 一.初时Loc ...
- python8.4景区买票
from threading import Threadimport threadinglock=threading.Lock()num=100#定义买票方法def sale(name): lock. ...
随机推荐
- Typekit在线字库及使用方法
一.如果设计中使用了非标准的字体,你该如何去实现? 所谓的标准字体是多数机器上都会有的,或者即使没有也可以由默认字体替代的字体. 方法: 用图片代替 web fonts在线字库,如Google Web ...
- Anagram 由颠倒字母顺序而构成的字
2018-07-15 19:23:08 Valid Anagram 问题描述: 问题描述: 可以使用map来记录各个字符出现的个数,在O(n)的时间复杂度内完成,当然也可以使用排序算法在O(nlogn ...
- linux机器之间拷贝和同步文件命令
1 不同机器拷贝文件 scp 文件 登录用户@机器IP:/目录/子目录 scp filename test@10.20.130.202:/home/test/ 2 文件[夹]同步 rsync ...
- 『Nltk』常用方法
引言 在nltk的介绍文章中,前面几篇主要介绍了nltk自带的数据(书籍和语料),感觉系统学习意义不大,用到哪里看到那里就行(笑),所以这里会从一些常用功能开始,适当略过对于数据本体的介绍. 文本处理 ...
- python-day21--random模块
>>> import random #随机整数 >>> random.randint(1,5) # 大于等于1且小于等于5之间的整数 >>> ra ...
- C#窗体控件简介ListBox
ListBox 控件 ListBox 控件又称列表框,它显示一个项目列表供用户选择.在列表框中,用户 一次可以选择一项,也可以选择多项. 1.常用属性: (1) Items属性: 用于存放列表框中的列 ...
- JavaScript语言简介
Web程序不论是B/S还是C/S构架,分为客户端程序与服务器端程序两种. ASP.NET是开发服务器端程序的强大工具,但有时为了降低服务器负担与通信流量,这就需要编写能够在客户端执行的程序. 脚本语言 ...
- 使用API更新供应商名称及曾用名
原文地址 更新供应商名称 EBS R12 (12.1.3) 更新供应商名称或替代供应商名称不能直接使用 pos_vendor_pub_pkg.update_vendor(p_vendor_rec =& ...
- iOS UI-AlertView(警示框)和ActionSheet(选择框、操作表单)
#import "ViewController.h" @interface ViewController ()<UIAlertViewDelegate,UIActionShe ...
- C#Winform窗体实现服务端和客户端通信例子(TCP/IP)
Winform窗体实现服务端和客户端通信的例子,是参考这个地址 http://www.cnblogs.com/longwu/archive/2011/08/25/2153636.html 进行了一些异 ...