这里最近的一个问题有以下代码(好吧,类似于此)来实现没有同步的单例。publicclassSingleton{privateSingleton(){}privatestaticclassSingletonHolder{privatestaticfinalSingletonINSTANCE=newSingleton();}publicstaticSingletongetInstance(){returnSingletonHolder.INSTANCE;}}现在,我想明白这是在做什么。由于实例是staticfinal,它是在任何线程调用getInstance()之前很久就构建的,因此实际上
我在很多地方读到单例可以使用接口(interface)。有些我无法理解这一点。 最佳答案 每个类都可以实现一个接口(interface),而Singleton只是一个“普通”类,它确保除了它可能实现的其他业务逻辑之外,在任何时间点都只存在一个实例。这也意味着Singleton至少有2个职责,这不是好的OO设计,因为类应该只有1个职责并确保它们擅长该职责,但这是另一个讨论。 关于java-单例类如何使用接口(interface)?,我们在StackOverflow上找到一个类似的问题:
因此,我正在考虑构建一个业余爱好项目,这是一种特殊的东西,只是为了复习我的编程/设计。它基本上是一个多线程网络爬虫,更新相同的数据结构object->int。因此为此使用数据库绝对是矫枉过正,我唯一能想到的就是用于包含我的数据结构的线程安全单例。http://web.archive.org/web/20121106190537/http://www.ibm.com/developerworks/java/library/j-dcl/index.html我应该研究其他方法吗? 最佳答案 双重检查锁定已被证明是不正确和有缺陷的(至少在J
这是关于如何存储生命周期应等于应用程序生命周期的@Singleton作用域Dagger2组件的第N个问题。在使用Dagger2的Android应用程序中,通常至少有一个Component是@Singleton范围的,并且应该在应用程序的整个生命周期中持续存在:由于这些要求,它通常被初始化并存储在自定义Application类中。因为这个组件的实例必须在我们应用程序的所有部分都可以访问,所以我见过这样的代码:1。将组件存储在应用程序类内的公共(public)静态变量中。publicclassAppextendsApplication{publicstaticAppComponentapp
在我的面试中,面试官以单例模式开始他的问题。我写在下面。然后,他问我们不应该在getInstance方法中检查Nullity吗?我回答说,不需要,因为成员是静态类型并且同时被初始化。但是,他似乎对我的回答不满意。我是否正确?classSingle{privatefinalstaticSinglesing=newSingle();privateSingle(){}publicstaticSinglegetInstance(){returnsing;}}现在,下一个问题是为多线程环境编写单例类。然后,我编写了双重检查单例类。classMultithreadedSingle{privates
实现单例的一种常见(1、2)方法是使用带有静态成员的内部类:publicclassSingleton{privatestaticclassSingletonHolder{publicstaticfinalSingletoninstance=newSingleton();}publicstaticSingletongetInstance(){returnSingletonHolder.instance;}privateSingleton(){//...}}据说这个实现是延迟初始化和线程安全的。但是到底是什么保证了它的线程安全呢?JLS17处理线程和锁的文章没有提到静态字段具有任何类型的h
我有两个版本的“Initialization-on-demandholderidiom”:http://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiomhttp://en.wikipedia.org/wiki/Singleton_pattern#The_solution_of_Bill_Pugh上面的主要区别在于第一个将INSTANCE声明为private,而第二个将INSTANCE声明为public.请告诉我应该使用哪个。抱歉,我没有发现在我的应用程序中使用private和public之间的区别:publiccla
我有一些用作单例的类。它们共享一些基本功能并从通常不用作单例的库中扩展相同的祖先。如果我将公共(public)功能放在一个从公共(public)祖先继承的基类中,我得到一个实例化没有意义的类,所以我把它抽象化了。此外,因为这些类都用作单例,所以它们都应该有一个init()和一个getInstance()方法,它们都是静态的。所有构造函数当然都是非公开的。现在,由于static是抽象方法的非法修饰符,因此以下内容不起作用,尽管这正是我想要的:classBaseextendsLibraryClass{protectedBase(){//...constructor}//...commonm
给定以下多重元素:publicclassMultiton{privatestaticfinalMultiton[]instances=newMultiton[...];privateMultiton(...){//...}publicstaticMultitongetInstance(intwhich){if(instances[which]==null){instances[which]=newMultiton(...);}returninstances[which];}}在没有getInstance()方法昂贵的同步和双重检查锁定的争议的情况下,我们如何才能保持线程安全和惰性?提到
我正在阅读thisarticle关于“双重检查锁定”和文章的主要主题,我想知道为什么在文章的某些地方作者使用下一个成语:Listing7.Attemptingtosolvetheout-of-orderwriteproblempublicstaticSingletongetInstance(){if(instance==null){synchronized(Singleton.class){//1Singletoninst=instance;//2if(inst==null){synchronized(Singleton.class){//3inst=newSingleton();//