• 第九周课程总结&实验报告(七)


    实验任务详情:

    完成火车站售票程序的模拟。
    要求:
    (1)总票数1000张;
    (2)10个窗口同时开始卖票;
    (3)卖票过程延时1秒钟;
    (4)不能出现一票多卖或卖出负数号票的情况。

    源代码

    package line;
    
    class MyThread implements Runnable{
    	private int ticket = 1000;
    	public void run() {
    			while(true) {
    				synchronized(this) {
    				if(ticket>0) {
    					try {
    						Thread.sleep(100);
    					}catch(InterruptedException e) {
    						e.printStackTrace();
    					}
    					System.out.println(Thread.currentThread().getName()+"正在售出第"+ticket+"张票");
    					ticket--;
    				}
    			}
    		}
    	}	
    };
    public class Demo{
    	public static void main(String[] args) {
    		MyThread m = new MyThread();
    		Thread mt1  = new Thread(m,"窗口0");
    		Thread mt2  = new Thread(m,"窗口1");
    		Thread mt3 = new Thread(m,"窗口2");
    		Thread mt4 = new Thread(m,"窗口3");
    		Thread mt5 = new Thread(m,"窗口4");
    		Thread mt6 = new Thread(m,"窗口5");
    		Thread mt7 = new Thread(m,"窗口6");
    		Thread mt8 = new Thread(m,"窗口7");
    		Thread mt9 = new Thread(m,"窗口8");
    		Thread mt10 = new Thread(m,"窗口9");
    		mt1.start();
    		mt2.start();
    		mt3.start();
    		mt4.start();
    		mt5.start();
    		mt6.start();
    		mt7.start();
    		mt8.start();
    		mt9.start();
    		mt10.start();
    		
    	}
    }
    

    运行截图


    总结

    多线程安全问题的原因:
    发现一个线程在执行多条语句时,并运算同一个数据时,在执行过程中,其他线程参与进来,并操作了这个数据。导致到了错误数据的产生。
    多个线程在操作共享数据,有多条语句对共享数据进行运算。这多条语句,在某一个时刻被一个线程执行时,还没有执行完,就被其他线程执行了。

    解决安全问题的原理:
    只要将操作共享数据的语句在某一时段让一个线程执行完,在执行过程中,其他线程不能进来执行就可以解决这个问题。

    如何进行多句操作共享数据代码的封装呢?

    同步代码块

    synchronized(对象) {  //任意对象都可以。这个对象就是锁。
    
        需要被同步的代码;
    
    }
    
  • 相关阅读:
    java读取jar包中的文件
    mysql 常用命令搜集
    如何终端自动导入cer开发证书到钥匙串
    解决第三方库私有api造成的apple审核不通过。
    push证书过期,不需要升级客户端。
    mac下面新建qq(多开/打开多个)登录方法
    行动力才是王道
    wordpress | 网站访问速度优化方案(Avada)
    HTML | video的封面平铺方法
    PHP | 获取数组长度的方法
  • 原文地址:https://www.cnblogs.com/clayLJX/p/11737891.html
Copyright © 2020-2023  润新知