Клас з ключовим словом static
дозволяє декларувати об'єкти, які ініціюються
лише раз. Якщо та сама команда виконується вдруге, ініціалізація буде
пропущена. Кожен потік отримає свій власний об'єкт static
(ЛПП - локальна пам'ять потоку), що завадить йому ідентифікувати
або модифікувати інший об'єкт потоку static
– у той же час, ім'я
змінної залишається незмінним. Таким чином, static
дозволяє
декларувати об'єкт зі збереженням стану, що є важливим для
поточного потоку.
Це відрізняється від тих же C/C++ і Java, де static
відіграє
глобальну роль при застосуванні, тягнучи за собою проблеми
синхронізації у багатопоточності.
Значення, присвоєне до змінної static
повинно бути визначене під час
компіляції. Воно не повинно мати залежностей під час реалізації!
Необхідно форматувати змінні static
під час реалізації,
використовуючи одноразовий конструктор static this()
для структур,
класів і модулів.
static int b = 42;
// b ініціюється лише раз!
// При запуску з різних потоків
// кожен b буде мати "власну" b
// без зовнішнього втручання
// інших потоків.
Крім того, для декларування «класичної» глобальної змінної, яку може
модифікувати кожен потік, необхідно використати клас пам’яті
__gshared
, який є еквівалентом класу static
у мові програмування С.
Таке здавалося б жахливе ім'я заохочує використовувати цей клас якомога
рідше.
__gshared int b = 50;
// Також ініціюється лише раз!
// Дійсно важливий b,
// може читатися і модифікуватись
// (небезпечно) кожним потоком!