zoukankan      html  css  js  c++  java
  • 多线程售票与同步机制

    先看下面的程序来售票

     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

     

     

  • 相关阅读:
    Yii UI 小部件
    Sketch Measure 产品图例和标注工具
    使用 redis “捕捉” “用户登录过期” 事件
    后端判断用户是否关闭浏览器(关闭网站相关的全部tab)
    js精准时间迭代器(定时器)
    chm只看到目录,看不到内容解决办法
    form提交表单没接收到$_POST
    旺店通erp系统
    DokuWiki 开源wiki引擎程序
    kohana 简单使用
  • 原文地址:https://www.cnblogs.com/YXBLOGXYY/p/14808231.html
Copyright © 2011-2022 走看看