简单模拟一个线程安全的售票样例
前言
学Java的小伙伴们,在接触多线程的时候,肯定多少会有些模糊。什么是多线程,什么是线程呐,线程的安全是通过什么样的方式来实现的呢,当然作为一个过来人。最初我也是带着这样的一系列的问题慢慢琢磨的,还清新的记得学习这些问题的时候做过一个案例,也就是今天的售票样例。但是实现一个普通的售票样例,大可能都会写,但是要保证售票的安全性以及数据的完整性,可能还是需要在里面做一些手脚的。
在代码中为了保证他们操作的共享数据的一致性,使用了Synchronized同步代码快解决多线程是操作的同一个数据,下面看一这个样例的完整的代码
package com.study.test01;
/**
* @Auther: Mr.zhou
* @Date: 2020/8/12 18:52
*/
public class Dome implements Runnable {
private int ticket = 100; // 总票数
@Override
public void run() {
while (true) {
synchronized (this) {
if (ticket > 0) {
try {
// 使线程休眠1秒种
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + ticket);
// 票数减一
ticket--;
} else {
break;
}
}
}
}
}
class windown{
public static void main(String[] args) {
Dome dome = new Dome();
Thread t1 = new Thread(dome);
Thread t2 = new Thread(dome);
Thread t3 = new Thread(dome);
t1.setName("买票窗口一");
t2.setName("买票窗口二");
t3.setName("买票窗口三");
t1.start();
t2.start();
t3.start();
}
}
总结:
接触过多线程的小伙伴应该都知道,创建多线程一共是有四种方式的,分别是
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口(支持泛型,带有返回值)
- 使用线程池进行创建多线程
他们的各自特点在这里就不一一解释了,不知道的小伙伴可以自行百度了解
其中实现接口与继承类的最大的区别是Java种类只能是单继承,接口支持多实现,本次售票样例中使用的就是实现Runnable接口