基於this topic,我放下了一個有趣的Singleton模式,其實現基於AtomicIntegers。這個Singleton是一個線程安全的嗎?
的問題是:
- 這是實現正確的,線程安全的,一般是有可能使用原子變量進行線程同步和管理?
- 其他問題:如果這個實現是線程安全的,我真的需要一個
volatile
修飾符的實例變量嗎?
public class StrangeSingleton
{
private StrangeSingleton() {};
private static volatile Object instance;
private static AtomicInteger initCounter = new AtomicInteger();
private static AtomicInteger readyCounter = new AtomicInteger();
static Object getInstance()
{
if (initCounter.incrementAndGet() == 1)
{
instance = new Object();
readyCounter.incrementAndGet();
return instance;
}
else if (readyCounter.get() == 1)
{
return instance;
}
else
{
//initialization not complete yet.
//write here some logic you want:
//sleep for 5s and try one more time,
//or throw Exception, or return null..
return null;
}
}
}
更新:增加了私有的構造函數,但它不是重點。
您錯過了私有構造函數! – Santosh
當有人可以調用'new StrangeSingleton()'時,它怎麼可能是單例。創建一個不帶任何參數的私有構造函數。 – km1
你可以使用'AtomicBoolean'而不是'AtomicInteger'。使用'compareAndSet()'。 – Gray