实验任务详情:
完成火车站售票程序的模拟。
要求:
(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(对象) { //任意对象都可以。这个对象就是锁。
需要被同步的代码;
}