线程安全与对象锁

在多线程程序当中,线程安全是很重要的问题,当我们刚开始接触多线程程序时,编写还是非常简单的多线程程序,再复杂也就是飞机大战这样的小游戏,所以线程出错的概率不大。但是计算机设计出来是为了处理巨量的数据,处理大量数据往往就需要大量的线程,在这么高速的运算下,线程安全问题就变得尤为重要。

我写了一个简单的多线程买票程序,这个程序在短时间内将会通过线程进行大量的操作,下图是该程序运行的结果,这个程序是一个人买一张票,但观察结果会发现有两个人买到了相同的票,这并不符合我们设计程序的预期,这个问题是如何发生的呢,该如何解决?

这个程序的主要代码就这么两句:

出现问题的原因在于下面一句,这一句的作用是在每次循环中数字减去一,同时减去一这个步奏有三步,第一步取出这个值,第二步才是减一,第三步是把这个值放回去,而在高速的运算中,系统分配给每个线程的执行时间都是有限的,这个线程可能来不及完成三步,系统分配给他的时间就已经结束了,这个线程也就失去了执行权,直接进行了下一个线程,所以才导致了不同的人取出了同一个号。

解决方法:

使用对象锁:

synchronized(){}
synchronized(监听器/锁){  需要同步的代码块...}
监听器/锁:任何一个对象都可以作为监听器(锁),比如this,也可以是程序中的一个变量

在需要同步的代码块执行完毕之前,当前线程不会停止

这是加上对象锁后的效果:

这次程序并没有出错,这就是对象锁的效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值