我有定义类的脚本(例如,Singleton.php)。这个类实现了PHP手册中的经典单例模式:
class Singleton {
private static $instance;
public static function getInstance()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
public function run() {
// bunch of "thread safe" operations
} }
$inst = Singleton::getInstance();
$inst->run();
问题。如果我从命令行('php Singleton.php
')调用此脚本两次,run()方法是否真的“线程安全”?它似乎不会。我曾经通过文本文件模仿单进程运行,其中存储了一些标志,但似乎可能还有其他情况。你的想法?
答案 0 :(得分:1)
单身人士与线程安全无关。它们每个进程只有一个对象实例。
所以,回答你的问题:不,你的脚本不是线程安全的。 php将为cli上的每个调用启动一个进程(而不是线程)。这两个进程都将创建一个类的实例,并且两个进程都会尝试编写该文件。
稍后写入文件的过程将获胜,并覆盖第一个过程的更改。
答案 1 :(得分:1)
PHP没有线程 - 它是面向流程的。每次调用PHP(命令行或apache实例)都与内存无关。
您的单身人士只对该一个过程是唯一的。
(哦,而不是做$c=__CLASS__; $instance = new $c;
你应该像$instance = new self();
那样使用'self'。相同的结果,更少的烦恼。同时一定要设置你的__construct()私有/受保护的
答案 2 :(得分:0)
如果从命令行运行此脚本两次(我猜是同时发生),您将获得两个完全不同的进程,因此线程安全性不是问题:此处没有线程。