没有锁的Thrift PHP单例?
Posted
技术标签:
【中文标题】没有锁的Thrift PHP单例?【英文标题】:Thrift PHP singleton without locks? 【发布时间】:2015-06-03 07:42:19 【问题描述】:我来自 C++ 世界。
最近,我开始使用 RPC 框架 Apache Thrift。我正在编写 php 客户端代码和 Python 服务器代码。
在阅读 PHP 实现时,我发现以下内容:
class TStringFuncFactory
private static $_instance;
/**
* Get the Singleton instance of TStringFunc implementation that is
* compatible with the current system's mbstring.func_overload settings.
*
* @return TStringFunc
*/
public static function create()
if(!self::$_instance)
self::_setInstance();
return self::$_instance;
....
它是没有锁的单例。
问题
PHP的处理模式是什么?是否保证不会发生这种风险的情况。
【问题讨论】:
也许_setInstance
方法可以处理任何锁定/访问问题?
@NikosM。我不确定,这就是我在这里问的原因。应该有一些锁定机制来确保其正确性。由于我对php很陌生,所以我想知道它的详细信息。
我不使用 apache thrift,但您不能查看源代码并查看您自己,或者在这里发布吗?
@NikosM。可以参考这个github.com/apache/thrift/blob/master/lib/php/lib/Thrift/Factory/…,其中_setInstance
显然不使用锁。
我知道它可能不需要,这只是一个 shim 来处理多字节字符串(如果它们不是 php 安装的一部分)并且与多线程/锁定无关,所以我不明白,我可能错了
【参考方案1】:
+1 @NB
PHP(cli 或 http)作为单个 cpu 核心上的单个线程存在,除非您做一些实际工作来使您的应用程序成为多线程的。
How can one use multi threading in PHP applications
对于 HTTP 端,每个 PHP 执行都随着请求周期而生死。服务器可能同时处理多个请求,这将导致多个 PHP 并发执行,但每个请求都完全独立于下一个请求。
所以基本上这不是问题。出于所有意图和目的,检查静态数据成员是否满足单例模式。
【讨论】:
以上是关于没有锁的Thrift PHP单例?的主要内容,如果未能解决你的问题,请参考以下文章