Итак, у меня есть основной класс, который вызывает другой одноэлементный класс, но при запуске нескольких потоков (или параллельных потоков) я получаю перекрестное загрязнение данных.Это очень простая версия, чтобы объяснить проблему.Все установщики / получатели переменных находятся в Singleton и вызываются и устанавливаются основным классом.
class A {
public function doSomething($var) {
Singleton::instance()->setVar($var);
}
public function showSomething() {
return Singleton::instance()->getVar();
}
}
// Singleton
class Singleton {
private static $instance = null;
private $var;
public static function instance() {
if(!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
public function setVar($var) {
$this->var = $var;
}
public function getVar() {
return $this->var;
}
}
тестовый скрипт 1:
$actions = Array(
'one',
'two',
'three',
);
foreach($actions as $act) {
$action = new A();
$action->doSomething($act);
echo "Action: ".$action->showSomething()."\n";
sleep(2);
}
вывод тестового скрипта 1 будет иметь;
one
two
three
тестовый скрипт 2:
$actions = Array(
'1',
'2',
'3',
);
foreach($actions as $act) {
$action = new A();
$action->doSomething($act);
echo "Action: ".$action->showSomething()."\n";
sleep(2);
}
вывод тестового скрипта 2 будет иметь;
1
2
3
one
two
three
(не в этом порядке, и в нем может отсутствовать одно из значений)
Так почему тест 1 включен в результаты теста 2 при выполнении обоих сценариев одновременно?
Как я тестирую:
открыть два терминала, выполнить по одному сценарию на каждом терминале (отсюда и спящий режим), чтобы я мог видеть загрязнение данных.