GOF23之单例模式(一)
编程离不开它的设计思想,常见的设计模式有这23种:
单例模式的核心作用:
保证一个类只有一个对象,并提供一个访问该实例的全局访问点。
优点:能减小占用内存,减少系统性能开销
饿汉式实现(单例对象立即被加载)
/** * @ClassName: * @PackageName: com.test.testwebsocket.singleton * @author: youjp * @create: 2019-08-19 15:28 * @description: 测试单例模式- 饿汉式 * @Version: 1.0 */ public class Singletondemo1 { //类初始化时,立即加载这个对象; 由于加载类时,天然的是线程安全的 private static Singletondemo1 singletondemo1 =new Singletondemo1(); private Singletondemo1() { } //方法没有同步,调用效率高 public static Singletondemo1 getSingletondemo1(){ return singletondemo1; } }
说明:饿汉式单例模式代码中,static修饰的变量在类加载时初始化,此时不会涉及多个线程对象访问该对象的问题。虚拟机保证只加载一次该类,肯定不会发生并发访问的问题。所以可以省略synchronized关键字。
问题: 如果只是加载本类,而不是要调用getSingletondemo1() ,甚至永远没有调用,则会造成资源浪费。
懒汉式实现(单例对象延迟加载)
/** * @ClassName: * @PackageName: com.test.testwebsocket.singleton * @author: youjp * @create: 2019-08-19 15:47 * @description: 单例模式- 懒汉式 * @Version: 1.0 */ public class Singletondemo2 { private static Singletondemo2 s; private Singletondemo2() { //私有化构造器 } public static synchronized Singletondemo2 getS(){ if (s ==null){ s= new Singletondemo2(); } return s; } }
说明:如它名字一样 lazy。 懒汉式的特点是懒加载,延迟加载。在需要使用的情况下,才会去加载
问题:资源利用率高,但是每次调用getS()都需要同步,并发效率低。