[Java基础]线程同步之卖票案列分析
案列:
卖票。
需求:
某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票。
代码如下:
package SellTicketPack;public class SellTicket implements Runnable{private int tickets = 100;@Overridepublic void run() {while (true) {if (tickets > 0) {System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");tickets--;}}}
}
package SellTicketPack;public class SellTicketDemo {public static void main(String[] args){SellTicket st = new SellTicket();Thread t1 = new Thread(st,"窗口1");Thread t2 = new Thread(st,"窗口2");Thread t3 = new Thread(st,"窗口3");t1.start();t2.start();t3.start();}
}
代码如下:
package SellTicketPack;public class SellTicket implements Runnable{private int tickets = 100;@Overridepublic void run() {while (true) {if (tickets > 0) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");tickets--;}}}}
package SellTicketPack;public class SellTicketDemo {public static void main(String[] args){SellTicket st = new SellTicket();Thread t1 = new Thread(st,"窗口1");Thread t2 = new Thread(st,"窗口2");Thread t3 = new Thread(st,"窗口3");t1.start();t2.start();t3.start();}}
代码如下:
package SellTicketPack;public class SellTicket implements Runnable{private int tickets = 100;private Object obj = new Object();@Overridepublic void run() {while (true) {synchronized (obj) {if (tickets > 0) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");tickets--;}}}}}
同步方法:
代码如下:
package SellTicketPack;public class SellTicket implements Runnable{private int tickets = 100;private Object obj = new Object();private int x = 0;@Overridepublic void run() {while (true) {if (x%2==0) {// synchronized (obj)synchronized (this){if (tickets > 0) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");tickets--;}}}else{// synchronized (obj) {// if (tickets > 0) {// try {// Thread.sleep(100);
// } catch (InterruptedException e) {// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
// tickets--;
// }
// }sellTicket();}x++;}}// private void sellTicket() {// synchronized (obj) {// if (tickets > 0) {// try {// Thread.sleep(100);
// } catch (InterruptedException e) {// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
// tickets--;
// }
// }
// }private synchronized void sellTicket() {if (tickets > 0) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");tickets--;}}}
同步静态方法:
代码如下:
package SellTicketPack;public class SellTicket implements Runnable{// private int tickets = 100;private static int tickets = 100;private Object obj = new Object();private int x = 0;@Overridepublic void run() {while (true) {if (x%2==0) {// synchronized (obj)
// synchronized (this)synchronized (SellTicket.class){if (tickets > 0) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");tickets--;}}}else{// synchronized (obj) {// if (tickets > 0) {// try {// Thread.sleep(100);
// } catch (InterruptedException e) {// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
// tickets--;
// }
// }sellTicket();}x++;}}// private void sellTicket() {// synchronized (obj) {// if (tickets > 0) {// try {// Thread.sleep(100);
// } catch (InterruptedException e) {// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
// tickets--;
// }
// }
// }private static synchronized void sellTicket() {if (tickets > 0) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");tickets--;}}}
代码如下:
package SellTicketPack02;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class SellTicket implements Runnable{private int tickets = 100;private Lock lock = new ReentrantLock();@Overridepublic void run() {while (true) {try{lock.lock();if (tickets > 0) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");tickets--;}}finally {lock.unlock();}}}}
package SellTicketPack02;public class SellTicketDemo {public static void main(String[] args){SellTicket st = new SellTicket();Thread t1 = new Thread(st,"窗口1");Thread t2 = new Thread(st,"窗口2");Thread t3 = new Thread(st,"窗口3");t1.start();t2.start();t3.start();}}
[Java基础]线程同步之卖票案列分析相关推荐
- Java中线程的学习(四)——线程的进阶应用(涉及锁、经典卖票案列)
下面进行线程的进阶应用 ①需求:计算任务,一个包含了2万个整数的数组,分拆了多个线程来进行并行计算,最后汇总出计算的结果. public class Count {public static void ...
- Java基础 线程同步
线程的同步:在编程过程中,为了防止多线程访问共享资源时发生冲突,Java提供了线程同步机制.所谓同步,就是指一个线程等待另一个线程操作完再继续的情况. 线程安全:一个类很好地同步以保护它的数据,这个类 ...
- Java线程同步-模拟买票
文章首发于 2020-11-29 知乎文章:Java线程同步-模拟买票 作者:落雨湿红尘(也是我o) 01 导语 本文使用JAVA代码模拟买票场景下的业务交互,通过示例讲解线程的初始化.线程同步等ja ...
- JAVA中线程同步的方法(7种)汇总
JAVA中线程同步的方法(7种)汇总 同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法. ...
- JAVA中线程同步的几种实现方法
JAVA中线程同步的几种实现方法 一.synchronized同步的方法: 1.synchronized同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁, ...
- 【Java9】异常,finally,线程创建(卖票),线程同步(卖包子),线程练习
文章目录 1.错误和异常区别:Arrays.toString(array) 2.编译和运行异常:SimpleDateFormat 3.处理异常:方法声明抛出 4.finally关键字:catch相当于 ...
- java thirteen线程同步机制
2019独角兽企业重金招聘Python工程师标准>>> 解决资源共享问题的方法一般是在指定时间段内只允许一个线程访问共享资源,这时就需要给共享资源上一道锁,比如售票员售票,当一个售票 ...
- Java基础——线程基础
线程相关概念 程序 程序就是为完成特定任务.用某种语言编写的一组指令的集合.简单来说就是我们写的代码. 进程 进程是指运行中的程序,比如我们打开一个应用,就是启动了一个进程,操作系统就会为该进程分配内 ...
- Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析
1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步 ...
最新文章
- JAVA SAX解析XML字符串实例
- 从创建数据库到备份恢复还原详解
- Eclipse中用户库的使用
- 云南计算机应用技术专科学校排名,2021年云南十大专科学校排名 云南最好的高职院校...
- PAT甲级1086 Tree Traversals Again:[C++题解]二叉树中序序列、栈、求后序遍历
- SNMP功能开发简介 三 使用DEBUGMSG打印指定的信息
- 心理医生给女人的忠告
- 2018 CVPR GAN 相关论文调研
- winsw将命令部署为服务(比如springboot)
- [android] 练习使用ListView(二)
- ue4显示变量_UE4:快速入门蓝图(Blueprint)的方法之一
- 查找命令find和其他常用查找命令
- php案例之后台数据显示-- PDO版(php data object)
- arm汇编指令集_汇编入门第一篇,小白也能看懂
- 关系代数表达式的优化
- Wireshark使用技巧
- 设计模式(二)--策略模式
- win10共享打印机怎么设置_win10系统设置共享打印机的方法步骤
- centos篇---安装mysql详细步骤
- 镜面反射辐照模型——不完全的翻译
热门文章
- 256种编程语言大荟萃
- C#趣味程序---水仙花数
- C语言之strstr函数类似Java字符串的contain函数
- 企业有了程序员为什么还要用 低代码/无代码
- 【C语言简单说】十三:变量的生命周期
- ios wkweb设置图片_iOS WKWebView (NSURLProtocol)拦截js、css,图片资源
- odbc mysql 配置文件_ODBC连接主流数据库的配置方法
- GFS(Genetic Fuzzy Systems)—— 基于专家先验规则库和遗传算法相结合的智能体决策算法
- centos静默安装oracle关于报错UnsatisfiedLinkError exception loading native library:njni10
- hm编码工具使用_H.265视频编码与技术全析(下)