关于多线程中的安全问题

时间:2022-12-27 07:48:41

关于多线程中的安全问题

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

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方法中调用

关于多线程中的安全问题


结果也是正确的:
关于多线程中的安全问题



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