一.
对原因进行分析一下,为什么之前没事,现在就有事。
在栈的里面,我们就不画主线程了,有四条线程路径,有自己的run方法。而这run方法如果里面写for循环,写上x的话,每个线程都有一份。
冲突吧?不冲突,都使用自己的,而当我们去卖票的时候,在运行堆里面的这个num,这个num就是多个线程所共享的数据。
第一个线程,在操作共享数据的时候,比如说大于0,还没等进行下一步操作,在中间停了一下。第二个线程过来操作了。等第二个线程操作完了之后,第一个线程回来看时,num数据有可能发生变化。就是这样的原因造成的。
大家发现如果线程不在if和sop之间停的话,连续操作它们俩,就不会出现问题。
大家发现如果线程不在if和sop之间停的话,连续操作它们俩,就不会出现问题。正因为一个线程读了一半,其他线程参与了进来,这一参与就出事儿了。本来第一个线程判断1>0,第一个线程就要输出,还没等操作,下个线程把1给操作了。
所以,我们究其原因是什么?
在操作共享数据的语句两条以上时,容易出事。一条没有问题。这两条语句,在一个线程读取的过程中,其他线程也会参与运算,这会导致问题。
出现安全隐患是有前提的。