多线程卖票问题

简介: 多线程卖票问题

 

public class Ticket {
    private int number =30;
    public  void sale(){
        if(number > 0){
            System.out.println(Thread.currentThread().getName() + "卖出了" +(number--) + "票,剩余:" + number);
        }
    }
 
    public static void main(String[] args) {
        Ticket ticket =  new Ticket();
        new Thread(()->{
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        },"A").start();
 
        new Thread(()->{
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        },"B").start();
 
        new Thread(()->{
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        },"C").start();
    }
}

执行结果:

可以看出多线程情况下,数据是不正确的

 

 

 

传统做法

加上synchronized关键字

加上synchronized关键字看下执行结果,可以看到是有序的

相关文章
|
7月前
|
Java
线程安全问题-卖票案例实现
线程安全问题-卖票案例实现
39 0
|
7月前
|
安全 Java
java多线程之Lock锁原理以及案例实现电影院卖票
java多线程之Lock锁原理以及案例实现电影院卖票
|
Java
Java代码实现多线程卖票
Java代码实现多线程卖票
82 0
|
Java
线程同步经典案例——卖票问题
用上面这种方式创建的所有线程都共享同一份数据,但如果用第一种创建线程的方式,则要将数据用static修饰才能共享
144 0
线程同步经典案例——卖票问题
JUC学习(二):Lock的介绍及使用(实现多线程卖票)
JUC学习(二):Lock的介绍及使用(实现多线程卖票)
114 0
JUC学习(一):synchronized的介绍及使用(实现多线程卖票)
JUC学习(一):synchronized的介绍及使用(实现多线程卖票)
101 0
|
安全 Java
【多线程:锁】卖票程序
【多线程:锁】卖票程序
136 0
多线程卖票问题
多线程卖票问题 我们模拟一个多窗口同时卖票的情景。问题的关键在于两个人不能卖出相同编号的一张票。
|
Java
JAVA培训—线程同步--卖票问题
线程同步方法: (1)、同步代码块,格式: synchronized (同步对象){ //同步代码 } (2)、同步方法,格式: 在方法前加synchronized修饰 问题: 多个人同时买票。 1、资源没有同步。
626 0
|
2月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
48 1
C++ 多线程之初识多线程