多线程数据共享问题(synchronized)

多线程数据共享

多线程下共享一个数据可能会出现线程不安全问题,即数据出错问题,原因为一个线程刚刚获取到该数据没有及时处理,该数据就被别的线程获取并使用了,导致该线程获取的数据和该数据实时的状态不一致
**解决方法,加锁

synchronized(Object lock=new Object)**{
run{
......
}
}

加锁后,锁内的程序将在执行完之前不会被夺走cpu,进入阻塞状态。

  1. 问题描述

    目前一趟车设定为 100 张票,由 4 个售票窗口进行售票处理,本次挑战需要完成数据共享的效果即可。

  2. 解题思路

    1. 需要创建一个子线程类 SellThread 实现 Runnable 接口,共享的 100 张车票需要在该线程类中进行处理。
    2. 线程名和票号需要打印输出,输出字符串 “线程名 票号:n” ,n 为票号值。
    3. 需要在主类 SellTicketsDatamain() 方法中,来启动子线程,也就是售票窗口。
    4. 线程名分别设置为 “售票窗口1,售票窗口2,售票窗口3,售票窗口4”。
    5. 类名和输出的信息必须按照以上?要求内容要求进行书写,不能随意扩展,并参考挑战运行效果图的内容,否则会影响挑战正常通过。
  3. 我的代码

    public class SellTicketsData {
    
      public static void main(String[] args) {
        // 启动 4 个售票窗口
        // 程序代码
        SellThread st1 = new SellThread();
        Thread t1 = new Thread(st1);
        SellThread st2 = new SellThread();
        Thread t2 = new Thread(st2);
        SellThread st3 = new SellThread();
        Thread t3 = new Thread(st3);
        SellThread st4 = new SellThread();
        Thread t4 = new Thread(st4);
        t1.setName("售票窗口1");
        t2.setName("售票窗口2");
        t3.setName("售票窗口3");
        t4.setName("售票窗口4");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
      }
    }
    
    // 创建子线程类 SellThread
    // 程序代码
    class SellThread implements Runnable {
      static int ticket_num = 100;
      static Object lock = new Object();
    
      @Override
      public void run() {
    
        // TODO Auto-generated method stub
        while (ticket_num > 0) {
          synchronized (lock) {
            if (ticket_num > 0) {
              System.out.println(Thread.currentThread().getName() + " 票号 :" + ticket_num--);
              
            }
            
          }
          try {
            Thread.sleep(1);
          } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
          }
          
        }
        
      }
      
      
      
    
  4. 实验结果

图片描述

图片描述

图片描述

  1. 遇到的问题及解决办法

有问题来问哈,写半天没人评论,爱

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值