在多线程程序当中,线程安全是很重要的问题,当我们刚开始接触多线程程序时,编写还是非常简单的多线程程序,再复杂也就是飞机大战这样的小游戏,所以线程出错的概率不大。但是计算机设计出来是为了处理巨量的数据,处理大量数据往往就需要大量的线程,在这么高速的运算下,线程安全问题就变得尤为重要。
我写了一个简单的多线程买票程序,这个程序在短时间内将会通过线程进行大量的操作,下图是该程序运行的结果,这个程序是一个人买一张票,但观察结果会发现有两个人买到了相同的票,这并不符合我们设计程序的预期,这个问题是如何发生的呢,该如何解决?
这个程序的主要代码就这么两句:
出现问题的原因在于下面一句,这一句的作用是在每次循环中数字减去一,同时减去一这个步奏有三步,第一步取出这个值,第二步才是减一,第三步是把这个值放回去,而在高速的运算中,系统分配给每个线程的执行时间都是有限的,这个线程可能来不及完成三步,系统分配给他的时间就已经结束了,这个线程也就失去了执行权,直接进行了下一个线程,所以才导致了不同的人取出了同一个号。
解决方法:
使用对象锁:
synchronized(){}
synchronized(监听器/锁){ 需要同步的代码块...}
监听器/锁:任何一个对象都可以作为监听器(锁),比如this,也可以是程序中的一个变量
在需要同步的代码块执行完毕之前,当前线程不会停止
这是加上对象锁后的效果:
这次程序并没有出错,这就是对象锁的效果