扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:开发者在线 来源:开发者在线 2007年8月8日
关键字:
多线程应用程序中的构造问题
在多线程应用程序中,你必须仔细构造Singleton模式。当Singleton不存在时,如果两个线程即将同时执行创建方法,这两个线程必须检查Singleton实例,但只有一个线程应当创建新对象。这个问题的典型解决办法就是对类使用相互排斥,指出对象正在被实例化。这是Singleton的一个线程安全的版本:
public class Singleton
{
// Private constructor suppresses generation
// of a (public) default constructor
private Singleton() {}
private static class SingletonHolder
{
private final static Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance()
{
return SingletonHolder.INSTANCE;
}
}
另一个解决办法是在getInstance()方法声明中添加synchronized关键字:
public static synchronized Singleton getInstance()
提前考虑克隆预防
你仍然可以使用对象的clone()方法克隆对象,建立一个Singleton对象。要禁用这一功能,你需要禁用对象的克隆方法,这产生一个CloneNotSupportedException例外。
public Object clone() throws
CloneNotSupportedException {
throw new CloneNotSupportedException();
}
考虑使singleton类位于最后
你可能希望将Singleton类放在最后,以避免Singleton的子类造成其它问题。
不要忘记垃圾收集
根据不同的执行,你的Singleton类和它的所有数据可能被当作垃圾收集。因此,在应用程序运行时,你必须保证存在一个Singleton类的实时引用。
结论
Singleton模块得到广泛地使用,并证实可用于软件设计。虽然这个模式并非Java专有,但它已成为Java编程的一个典型应用。尽管这个模式相当简单,但还是要记住我在本文中描述的Singleton模式的限制。
Peter V. Mikhalenko是一名通过Sun认证的专家,现在任德意志银行商业顾问。
责任编辑:德东
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。