По-долу е даден клас на Java, използващ сингълтън решение на Bill Pugh.
public class Singleton {
int nonVolatileVariable;
private static class SingletonHelper {
private static Singleton INSTANCE = new Singleton();
}
private Singleton() { }
public static Singleton getInstance() {
return SingletonHelper.INSTANCE;
}
public int getNonVolatileVariable() {
return nonVolatileVariable;
}
public void setNonVolatileVariable(int nonVolatileVariable) {
this.nonVolatileVariable= nonVolatileVariable;
}
}
На много места съм чел, че този подход е безопасен за нишки. Така че, ако го разбирам правилно, тогава единичният екземпляр се създава само веднъж и всички нишки, които имат достъп до метода getInstance
, ще получат един и същ екземпляр от класа Singleton
. Въпреки това се чудех дали нишките могат локално да кешират получения единичен обект. Могат ли? Ако отговорът е „да“, това не би означавало, че всяка нишка може да промени полето на екземпляр nonVolatileVariable
на различни стойности, което може да създаде проблеми.
Знам, че има други методи за създаване на сингълтън, като например enum singleton, но съм особено заинтересован от този метод за създаване на сингълтон.
Въпросът ми е, че има ли нужда да се използва променливата ключова дума като int volatile nonVolatileVariable;
, за да се уверите, че сингълтонът, използващ този подход, е наистина безопасен за нишки? Или вече наистина е безопасно за нишки? Ако да как?
volatile
може да се случи някоя нишка да не види промените вnonVolatileVariable
, направени от друга нишка. - person lexicore   schedule 17.03.2018