天天看点

线程安全问题

线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。也可以说线程安全问题,是因为访问了共享的数据。

模拟一个卖票过程,假设总共有100张票,有三个售票员(开启三个线程)

实现卖票

控制台打印出的结果:

线程安全问题
线程安全问题

 发现同一张票100被卖出了三次甚至是卖出不存在的票0,这明显是错误的。这时就出现线程安全问题。

原因:

  1.卖出三张100号的票,是因为三个线程同时执行了

且三个都线程都执行了tickets--,所以就没有99、98,而是直接跳转到了97。

  2.卖出了0号票,是因为当thread-0获得cpu的使用权进入run()方法时,然后由于程序调用了sleep()方法,故thread-0进入睡眠;此时thread-1获得cpu的使用权,进入run()方法,然后又sleep()睡眠了,失去了cpu的使用权;此时,thread-2获得cpu的使用权,进入run()方法,执行到sleep(),进入睡眠。然后thread-0睡醒了,开始输出语句,并且执行tickets--;此时tickets=0,且0>0不成立,故thread-0线程就退出了;故thread-1此时获得cpu,开始输出语句,此时tickets=0,故输出了0号票。