根据上篇文章买票问题举例,还可能出现的问题:
代码如下:
class Window1 implements Runnable{
private static int ticket = 100;
@Override
public void run() {
while (true){
if (ticket > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":卖票,票号为:" + ticket);
ticket--;
}else {
break;
}
}
}
}
public class WindowTest1{
public static void main(String[] args) {
Window1 w = new Window1();
Thread t1 = new Thread(w);
Thread t2 = new Thread(w);
Thread t3 = new Thread(w);
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}
运行结果如下:
我们可以看到出现了“0”票。
因为在此阻塞了,可能出现上文的极端状态
假如
这样重票的概率就大了
所以不管在哪里阻塞都会出现重票,错票
=========================================================================
引入问题:买票过程中,出现了重票,错票 --> 出现了线程的安全问题 问题出现的原因:当某个线程操作车票的过程中,尚未操作完成时,其他线程参与进来,也操作车票 如何解决? 根据生活中的事情举例: 假如你在上厕所,另一个人很急,冲进了你所在的厕所。这就出现了安全问题。应该如何解决? 答:把厕所门锁住 当一个线程a在操作ticket的时候,其他线程不能参与进来,直到线程a操作完成ticket时, 其他线程才可以开始操作ticket。这种情况即使线程a出现了阻塞,也不能被改变。
感谢观看!!!