栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java多线程模拟售票程序和线程安全问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java多线程模拟售票程序和线程安全问题

Java中线程部分知识中,售票程序非常经典。程序中也有一些问题存在!

需求:模拟3个窗口同时在售100张票。

问题1:为什么100张票被卖出了300张票?

原因:因为tickets是非静态的,非静态的成员变量数据是在每个对象中都会维护一份数据的,三个线程对象就会有三份。
解决方案:把tickets票数共享出来给三个线程对象使用。使用static修饰。

问题2: 出现了线程安全问题 ?

线程安全问题的解决方案:sun提供了线程同步机制让我们解决这类问题的。

java线程同步机制的方式:

方式一:同步代码块

方式二:同步函数

class SellTickets extends Thread{ 
   
  static int tickets=1;//票数 这里 必须定义为static。不然  非静态的成员变量,非静态的成员变量数据是在每个对象中都会维护一份数据的。三个线程对象就会有三份。 
  public SellTickets(String threadName) { 
    super(threadName); 
  } 
  public void run() { 
    while(true){ 
      synchronized ("锁") { 
 if(tickets==101){//或者 if(tickets>100){ 
   System.out.println("票已经卖完啦-_-..."); 
   break; 
 } 
 System.out.println(Thread.currentThread().getName()+"卖了第"+tickets+"号票"); 
 tickets++; 
  
      } 
      //System.out.println(Thread.currentThread().getName()+"锁后..."); 

    } 
     
  } 
} 
 
public class Demo4 { 
   
  public static void main(String[] args) { 
    //创建三个线程对象,模拟三个窗口 
    SellTickets s1=new SellTickets("窗口1"); 
    SellTickets s2=new SellTickets("窗口2"); 
    SellTickets s3=new SellTickets("窗口3"); 
    //开启线程售票 
    s1.start(); 
    s2.start(); 
    s3.start(); 
     
    System.out.println("main方法..."); 
  } 
} 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/140868.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号