线程同步——火车票问题

Posted dbbf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程同步——火车票问题相关的知识,希望对你有一定的参考价值。

1、问题

1.1  产生原因

  多个线程调用同一个变量的时候,因为一个时间点只有一个线程在跑,就会产生一些线程改变了这个变量,但是其它的线程却还是根据之前的变量在跑

1.2  具体问题

  两个卖票的线程,票不为0时进行买票,但是当两个线程都进行买票的方法中时,一个线程已经把票卖完了,但是另一个线程的卖票程序还在跑,所以就开始卖负票了

1.3  解决办法

  使用同步代码块

2、代码

  

 1 public class Demo {
 2     public static void main(String[] args) {
 3          Ticket t = new Ticket();
 4         new Thread() {                                        //线程一
 5 
 6             @Override
 7             public void run() {
 8             try {
 9                 this.sleep(10);
10             } catch (InterruptedException e) {
11                 // TODO Auto-generated catch block
12                 e.printStackTrace();
13             }
14             t.saleTicket();
15             }
16         }.start();
17         
18         new Thread() {                                        //线程二
19             
20             @Override
21             public void run() {
22                 try {
23                     this.sleep(100);
24                 } catch (InterruptedException e) {
25                     // TODO Auto-generated catch block
26                     e.printStackTrace();
27                 }
28                 t.saleTicket();
29             }
30         }.start();
31         
32     }
33 }
34 
35 class Ticket {
36     private int ticket = 100;
37     public void saleTicket() {    
38         while (ticket != 0) {
39             synchronized(Ticket.class) {
40                 System.out.println("...这是第" + ticket-- + "号票");
41             } 
42         }
43     }
44 }

 

以上是关于线程同步——火车票问题的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程4—线程同步问题+火车票售票系统

线程的同步机制:同步代码块&同步方法

java中多线程安全性和同步的常用方法

线程同步

java11_线程的同步

火车票线程同步互斥体实现