【发布时间】:2012-09-19 13:21:02
【问题描述】:
基于this topic,我提出了一个有趣的单例模式版本,它的实现基于AtomicIntegers。
问题是:
- 此实现是否正确且线程安全,通常是否可以使用原子变量进行线程同步和管理?
- 附加问题:如果此实现是线程安全的,我真的需要
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()时,它怎么可能是单身人士。创建一个不带参数的私有构造函数。 -
您可以使用
AtomicBoolean代替AtomicInteger。使用compareAndSet()。 -
@Santosh 你可以创建任意数量的 StrangeSingleton,只有一个
instance对象。
标签: java multithreading concurrency singleton atomic