java单例模式学习

来源:互联网 发布:wps表格查找重复数据 编辑:程序博客网 时间:2024/04/29 11:30

设计模式,是一种经验的总结(个人理解)形成的不具约束力的规范和实现。

由于java基础的薄弱,对单例模式不太理解,甚至现在再学还是只会学到皮毛,但是还是一点点看和学吧,等某一天了解了其深层次原理的时候才算学通了。

单例模式的目的是保证对象的唯一性,这就需要保证其他程序无法创建对象,且本类创建的对象唯一,只对外提供该类的方法。

保证第一点:构造函数私有化。

保证第二点:在本类中创建对象,且唯一。

保证第三点:提供获取对象的方法,public。

(1)只适合单线程环境

原因:多线程环境下同时判断if可能生成多个对象

public class Test {private Test(){}//私有化构造函数private static Test test=null;public static Test getInstance()//对外提供获取实例的方法{if(null==test){test=new Test();//本类中创建对象}return test;}}
(2适合多线程环境(懒汉式)

原因:getInstance()方法加了同步锁

public class Test2 {private Test2(){}//私有化构造函数private static Test2 test2=null;public static synchronized Test2 getInstance()//对外提供获取实例的方法{if(null==test2){test2=new Test2();//本类中创建对象}return test2;}}
(3)两次判断,加同步锁

原因:当test3为null时才加同步锁创建实例,否则无需获取同步锁

public class Test3 {private Test3(){}//私有化构造函数private static Test3 test3=null;public static Test3 getInstance()//对外提供获取实例的方法{if(null==test3){synchronized (Test3.class) {if(null==test3){test3=new Test3();//本类中创建对象}}}return test3;}}
(4)饿汉式(推荐使用)

原因:加载该类时就生成一个Test4的静态实例(使用到该类的话迟早要创建该实例),但是过早初始化该实例占用内存,达不到lazy loading的目的

public class Test4 {private Test4(){}private static Test4 test4 = new Test4();public static Test4 getInstance(){return test4;}}

(5)静态内部类(推荐)

还看得不太理解,看懂了补充。



原创粉丝点击