关于多线程中的安全问题

关于多线程中的安全问题

先说下这个安全问题产生的原因

1.多线程在运行状态的时候还是在就绪状态是完全随机的
2.线程可以在程序的任意位置由运行状态进入就绪状态
3.当线程由运行状态变为就绪状态再恢复到运行状态时,所有的变量值还是会使用之前的运行状态时的变量值。
所以就会产生了变量值被其他线程调用时数据不对,结果最终结果不对的错误


采取的方法

采取线程同步,何为同步?就是协同步调,使线程有次序有顺序的进行运行,这样的话,在一个线程执行这段代码,针对于这个变量进行代码操作的时候,其他线程就会等待这个线程完成,再调用代码对该变量操作。

补充说明:不是说通过线程的优先级可以确定吗,为什么不采取控制优先级来解决这个安全问题?
1.线程的优先级是一个整数,其取值范围是1(Thread.MIN PRIORITY)—10(Thread.MAX PRIORITY).默认情况下,每一个线程都会分配到一个优先级(NORM_PRIORITY)(5);
2.具有较高优先级的线程对程序更重要,并且应该在低优先级的线程之前分配到处理器资源,但是线程优先级不能保证线程执行的顺序,而且非常依赖于平台。

举个例子:我写了个火车站买票的例子,假如totalticket有20张,有三个售票点同时出票.

这里写图片描述

这里写图片描述
那么最后的结果显然出现了错误 还有负数,数据也不一致,这就是线程不同步导致的安全问题.

我们通常采取三种方法来解决这个问题:



1.第一种
采用的是同步方法 在方法前加入synchronized,新建一个SaleTicket类 里面写入方法saleTicket这里写图片描述



在TicketThread中加入调用
这里写图片描述


main方法不变
这里写图片描述


那么,结果是
这里写图片描述

2.第二种
采取synchronized数据块同步线程
在Saleticket类中加入方法saleTic ,采取synchronized声明代码块对进入的每一个线程进行同步

这里写图片描述


在线程run 方法中调用saleTic
这里写图片描述


结果也是正确的
这里写图片描述

3.第三种是采取线程锁



这里写图片描述

注意导入相应的包



在run方法中调用

这里写图片描述


结果也是正确的:
这里写图片描述



第一次发博客,仅供学习和娱乐。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值