基于这个话题,我提出了一个有趣的基于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;
}
}
}
更新:添加了私有构造函数,但这不是重点。
new StrangeSingleton()
时,它怎么可能是单例?创建一个不带参数的私有构造函数。 - km1AtomicBoolean
替代AtomicInteger
。使用compareAndSet()
方法。 - Grayinstance
实例对象。 - assylias