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

实验任务详情:

完成火车站售票程序的模拟。
要求:
(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(对象) {  //任意对象都可以。这个对象就是锁。

    需要被同步的代码;

}
原文地址:https://www.cnblogs.com/clayLJX/p/11737891.html