没有锁的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单例?的主要内容,如果未能解决你的问题,请参考以下文章

java 用volatile实现一个双重检查锁的单例模式

Java单例模式中双重检查锁的问题

单例模式的理解php

PHP设计模式-单例模式

php单例模式实现数据库类

单例 QNetworkAccessManager 没有将响应定向到所需的形式