Вот идея, которую я только что предложил, для безопасного и эффективного способа решения проблем синхронизации Singleton.Это в основном двойная проверка блокировки, но с поворотом, который включает локальное хранение потока.В псевдокоде в стиле Java / C # / D предполагается, что __thread
обозначает локальное хранилище потока для статических переменных:
class MySingleton {
__thread static bool isInitialized;
static MySingleton instance;
static MySingleton getInstance() {
if(!isInitialized) {
synchronized {
isInitialized = true;
if(instance is null) {
instance = new MySingleton();
}
}
}
return instance;
}
}
Это гарантирует, что блок synchronized
будет входить только один раз на поток в течение всей жизнипрограммы.Начиная с этого момента, мы получаем простую проверку локального bool-потока, чтобы увидеть, вошли ли мы уже в синхронизированный блок и убедились, что объект инициализирован из этого потока.