当前位置: 首页 > 后端技术 > PHP

什么是线程安全

时间:2023-03-29 13:42:55 PHP

1.PHP安装版中有开发版两个版本,线程安全版和线程非安全版。下面是开发版的解释:ts(Thread-Safety)表示线程安全,多线程访问时使用锁机制,当一个线程访问某个该类型的数据时,受到保护,其他线程无法访问直到线程读完它,其他线程才能使用它。不会有数据不一致或数据污染。在ISAPI模式下加载php时选择此版本。在ISAPI模式下加载php时选择此版本。nts(None-ThreadSafe)是非线程安全的,即不提供数据访问保护。有可能多个线程先后更改数据,导致脏数据。当PHP以fastcgi模式运行时,选择这个版本,性能更好。表现;我在哪里可以看到它?如下图打印phpinfo()会显示一些配置信息:幸运的是,我们在使用PHP版本时,不需要区分线程安全和非线程安全。ISAPI模式加载时选择这个,是微软提出的,所以只能在win平台上运行。非线程安全版本在Linux上运行。无论使用什么平台或Web服务器,只要PHP运行在cgi/fastcgi模式下,就使用非线性安全。线程不安全的原因是单线程开发过程中不会出现线程安全问题。只有在多线程使用的过程中,多个线程访问共享资源时,才会出现线程安全问题。只要资源没有变化,多个线程读取同一个资源是安全的。结合超买超卖的应用场景。想象一下,线程A和B同时执行同一产品的订单。A:读取商品库存为1B:读取商品库存为1A:订单扣库存成功-1B:订单扣库存成功-1B:操作成功,库存减少到-1这时候你会发现一个只有一件库存的产品已经卖出了两次。存在超卖现象。结合线程不安全的原因分析:只要资源不变,线程就是安全的。现在正在访问的资源的库存发生了变化,导致线程变得不安全。常见的高并发导致的超卖超买问题,更专业的说,就是线程不安全。那么问题来了,如何让线程安全呢?本文从代码层面来分析(其他层面的分析请看小编其他文章),我们可以从两个角度来分析局部变量:资源不被多线程共享和顺序执行(加锁)局部变量存放在线程自己的栈。也就是说,局部变量永远不会被多个线程共享。因此,基本类型的局部变量是线程安全的。下面是一个基本类型的局部变量的例子:publicvoidsomeMethod(){$value=0;$value++;}判断一个资源对象是否线程安全如果一个资源的创建、使用和销毁都在同一个线程中,并且永远不会离开线程的控制,那么这个资源的使用就是线程安全的。引用不是线程安全的!重要的是要记住,即使一个对象是线程安全的和不可变的,对该对象的引用也可能不是线程安全的classCalculator{private$currentValue=null;公共函数getValue(){返回$this.currentValue;}//传入参数的引用变量,将引用变量赋值给currentValue,随着引用变量的变化,currentValue也会随之变化publicfunctionsetValue(&$newValue){$this.currentValue=$newValue;}}最后,问题来了,上面是不是超买超卖,用了线程安全的写法后,是不是就没有线程安全了?结果是,即使程序代码是线程安全的,商品库存存在于数据库中,两个安全线程读取数据库库存进行修改,也会存在竞争关系。这时候是通过加锁来实现的,参考小编的其他文章。