一、并发下售票存在的Bug
首先让我们我们定义一个资源类Ticket我们通过多个线程来操作这一资源类,模拟卖票的例子:
//资源类
class Ticket{
//属性总共还剩有多少张票
private int number=50;
//卖票的方法
public void sale(){
if (number>0){
//卖掉一张票
number--;
try {
//延迟,目的是为了更好看出在并发下程序运行的效果
TimeUnit.MILLISECONDS.sleep(5);
System.out.println(Thread.currentThread().getName() + "卖出了" + (50-number) + "张票,剩余"+number+"张票");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
当我们在没有任何加锁的情况下进行多个线程并发操作:
public class SaleTicketDemo01 {
public static void main(String[] args) {
//并发:多个线程操作同一资源类,把资源类丢入线程
Ticket ticket=new Ticket();
//@FunctionalInterface 函数式接口,jdk8 lambda表达式
new Thread(()->{
for (int i = 0; i < 10; i++) ticket.sale(); },"A").start();
new Thread(()->{
for (int i = 0; i < 10; i++) ticket.sale(); },"B").start();
new Thread(()->{
for (int i = 0; i < 30; i++) ticket.sale(); },