Android中单例模式和静态方法在效率上哪个好

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中单例模式和静态方法在效率上哪个好相关的知识,希望对你有一定的参考价值。

很多人包括我写单例的时候,第一想到的就是懒汉式publicclassSingletonprivatestaticSingletoninstance;privateSingleton()publicstaticSingletongetInstance()if(instance==null)instance=newSingleton();returninstance;代码很简单,而且是懒加载,只有调用getInstance方法是才会初始化。但是这样是线程不安全的,即当多个线程并行调用getInstance的时候,就会创建多个实例,不能正常工作。所以这里就有了加锁方式,将整个getInstance方法设为同步,添加synchronized关键字。publicclassSingletonprivatestaticSingletoninstance;privateSingleton()publicstaticsynchronizedSingletongetInstance()if(instance==null)instance=newSingleton();returninstance;这样简单粗暴的方式,虽然做到了线程安全,但导致了同一时间内只能有一个线程能够调用getInstance方法。其实我们仅仅需要对初始化的代码进行同步,这就有了双重检验锁方式。publicclassSingletonprivatestaticSingletoninstance;privateSingleton()publicstaticSingletongetInstance()if(instance==null)//第一次检查synchronized(Singleton.class)if(instance==null)//第二次检查instance=newSingleton();returninstance;这里第二次检查,是因为如果有多个线程同时执行完了第一次检查,这时如果同步块内不进行第二次检查的话,会生成多个实例了。但是看了相关资料后,发现这样还是有点问题。引用资料中的介绍:由于instance=newSingleton(),这并非是一个原子操作,事实上在JVM中这句话大概做了下面3件事情。1.给instance分配内存2.调用Singleton的构造函数来初始化成员变量3.将instance对象指向分配的内存空间(执行完这步instance就为非null了)但是在JVM的即时编译器中存在指令重排序的优化。也就是说上面的第二步和第三步的顺序是不能保证的,最终的执行顺序可能是1-2-3也可能是1-3-2。如果是后者,则在3执行完毕、2未执行之前,被线程二抢占了,这时instance已经是非null了(但却没有初始化),所以线程二会直接返回instance,然后使用,然后顺理成章地报错。我们只需要将instance变量声明成volatile就可以了。 参考技术A 手机的音量向下键和电源按钮的同时按住10秒本回答被提问者采纳

Java中单例模式和静态类的区别

转:http://www.2cto.com/kf/201311/260911.html        确实存在一些场景,静态类比单例更适合,这个场景中主要的一个例子就是java.lang.Math。如果你的单例不需要维护任何状态,仅仅提供全局访问的方法,这种情况考虑使用静态类,静态方法比单例更快,因为静态的绑定是在编译期就进行的。但是要记住,不建议在静态类中维护状态信息,特别是在并发环境中,若无适当的同步措施而修改多线程并发时,会导致坏的竞态条件。如果你需要将一些工具方法集中在一起时,你可以选择使用静态方法,但是别的东西,要求单例访问资源时,应该使用单例模式。 1) 静态类比单例具有更好的性能,因为静态方法在编译期绑定。 2) 再次,它们的区别是override的能力,因Java中的静态方法是不可以覆盖的,这就导致其木有太多的灵活性,另一面,你可通过继承的方式覆盖单例   类中定义的方法(提供内包类)。 3) 静态类很难模拟,因此难于单例测试,单例更容易模拟,因为也比静态类易于编写单元测试,不论什么单例期望什么,你都可以传递模拟对象,例如构造方法或方法参数。 4)如果你的需求中需要维护状态信息,则单例比静态类更适合,因为后者在维护状态信息方面是非常可怕的,并导致狡滑的bug。 5)如果是一个非常重的对象,单例可以懒加载,但是静态类没有这样的优势,并且非常热切的加载。 6) 许多依赖注入的框架对单例都有良好的管理,例如Spring,使用它们非常容易。

以上是关于Android中单例模式和静态方法在效率上哪个好的主要内容,如果未能解决你的问题,请参考以下文章

Java中单例模式和静态类的区别

Qt中单例模式的实现(4种方法)

单例模式进阶之Android中单例模式的应用场景

java中3中单例模式例子

关于 Cocoa Touch 中单例的问题

JAVA单例设计模式