A.php
<?php
class Singleton
{
private static $instance;
private function __construct()
{
echo "This is ok!\r\n";
}
public static function GetInstance()
{
if (!(self::$instance instanceof self))
{
self::$instance = new self();
}
return self::$instance;
}
}
B.php
<?php
require_once('A.php');
class AsyncOperation extends Thread {
public function __construct($arg){
$this->arg = $arg;
}
public function run(){
if($this->arg){
Singleton::GetInstance();
}
}
}
$arr = array();
for($i=0;$i<10;$i++){
$arr[] = new AsyncOperation($i);
}
for($i=0;$i<10;$i++){
$arr[$i]->start();
}
本人写java的 看到php的单例如A.php表示,但是实际在pthreads扩展下多线程跑的时候,会打印出内容,多次构造该实例。求各位phper解答疑问
对java熟悉点,java中
public class Singleton{
private static Object instance = null;
public Object getInstance(){
if(instance==null){
synchronized(Singleton.class){
if(instance==null){
instance = new Singleton();
}
}
}
return instance
}
}
因为你的java里用的是double check方式,加上用synchronized对类实例方法加锁,当一开始有多个线程同时要该实例时,就会出现只有一个线程能进入类实现方法,其他线程等待解锁,当第一条线程将类实例后,其他线程进入加锁块时,就会被第二个判断拒绝而会获取已实例的实例;
而php中没有对类实现方法加锁。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。