多线程售票与同步机制

先看下面的程序来售票

复制代码
 1 package thread;
 2 
 3 public class Ticket {
 4     public static void main(String[] args) {
 5         SaleWindow saleWindow1 = new SaleWindow();
 6         SaleWindow saleWindow2 = new SaleWindow();
 7         SaleWindow saleWindow3 = new SaleWindow();
 8 
 9         saleWindow1.start();
10         saleWindow2.start();
11         saleWindow3.start();
12     }
13 }
14 
15 class SaleWindow extends Thread {
16     private static int ticket_num = 100;
17     @Override
18     public void run() {
19        while (true) {
20            if (ticket_num <= 0) {
21                System.out.println("售票结束");
22                break;
23            }
24            // 休眠50毫秒。模拟卖票要时间
25            try {
26                Thread.sleep(50);
27            } catch (InterruptedException e) {
28                e.printStackTrace();
29            }
30            System.out.println("当前窗口为 " + Thread.currentThread().getName() + "还剩 " + (--ticket_num) + "张票");
31 
32        }
33     }
34 }
复制代码

输出结果分析:

 

 出现上面情况的原因分析:、

线程123都会判断<=0不是成立的

所以123线程同时进到下面代码

 

 

 

 解决方案:

1)用synchronized关键字:synchronized是Java中的一个关键字,是一个内部锁。它可以使用在方法上和方法块上,表示同步方法和同步代码块。在多线程环境下,同步方法或者同步代码块在同一时刻只允许有一个线程在执行,其余线程都在等待获取锁,也就是实现了整体并发中的局部串行。

 

同步概念:

1)在多线程编程,一些敏感数据允许多个线程时访问。也就是数据在同一个时刻,最多有一个线程访问,保证数据的完整性安全性(窗口卖票系统)

2)也可以这样理解,当有一个线程在对内存进行操作时,其它线程都不可以对这个内存地址进行操作,知道该线程完成操作,其它线程才可以对该地址进行操作

同步的实现方法:

最简单的就是加关键字Synchronized

 

 

 

 

 

posted on   Love&Share  阅读(153)  评论(0编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示