在 PHP 中實現線程安全的單例模式,可以使用雙重檢查鎖定(Double-Checked Locking)方法
class Singleton {
private static $instance;
private static $lock = false;
private function __construct() {}
public static function getInstance() {
if (self::$instance === null) {
if (!self::$lock) {
self::$lock = true;
if (self::$instance === null) {
self::$instance = new Singleton();
}
self::$lock = false;
} else {
while (self::$lock) {
// 等待獲取鎖
}
}
}
return self::$instance;
}
}
這個實現方法中,我們首先檢查 $instance
是否為 null
。如果為 null
,則嘗試獲取鎖。如果成功獲取鎖,我們再次檢查 $instance
是否為 null
,如果仍然為 null
,則創建一個新的 Singleton
對象。釋放鎖后,返回 $instance
。如果沒有獲取到鎖,則進入循環等待,直到獲取到鎖為止。
這種實現方式可以確保在多線程環境下的線程安全,同時避免了不必要的同步開銷。