微信搜索superit|邀请体验:大数据, 数据管理、OLAP分析与可视化平台 | 赞助作者:赞助作者

PHP 里的单例模式 和 java的单例模式的区别

架构 aide_941 23℃
【已解决】请教 PHP 的单例模式是线程安全的吗

PHP 里的单例模式一般的写法

public static function getInstance () {
    if (!self::$instance) {
      self::$instance = new self();
    }
    return self::$instance;
  }

但是网上查到的资料都是 强调 java 里面使用单例模式的时候需要使用线程安全的写法

public class Singleton {
private static volatile Singleton singleton;
private Singleton() {}

public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

所以想请问下 PHP 的这种单例写法,是因为 PHP 内部有其他处理已经做到线程安全,还是说这样并不安全,有其他更完善的写法补充。。。求教 =。=,感谢

感谢 回复的朋友帮我指了一个方向

大致 php-fpm 处理流程

  1. 当客户端发送一个请求时,web server 会通过一个 php-fpm 进程(这里和下文所说指的 fpm 进程都是 fpm 开启的 worker 进程,关于 fpm 的工作原理这里不再累述)去执行 php 代码,php 代码的执行是单线程的。
  2. 那么,当有多个客户端同时发送请求时(并发),web server 就会为每个请求开启一个 php-fpm 进程去执行 php 代码。
  3. 请求执行过后,对应的 php-fpm 进程被销毁,内存得以释放。
  4. 而并发的问题在于,在某一时间,客户端请求让 php-fpm 进程数量达到了最大限制数,这个时候,新来的请求只能等待空闲的 php-fpm 来处理,这就是多进程同步阻塞模式的弊端,当然还有进程过多所带来的内存占用问题。
PHP-FPM 压根不需要关注线程安全问题。
php-fpm是多进程同步阻塞模式,它的单例不需要加锁,   而java和.net的单例需要加锁等待释放

转载请注明:SuperIT » PHP 里的单例模式 和 java的单例模式的区别

喜欢 (0)or分享 (0)