C/C++教程

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

本文主要是介绍多线程数据共享问题(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. 遇到的问题及解决办法

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

这篇关于多线程数据共享问题(synchronized)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!