单例设计模式
- 饿汉式
- 懒汉式
- 双重线程检查式
饿汉式
public class Person { private static final Person person=new Person();//常量 在第一次加载这个类时就有了 没法改变 private String nameString; public String getNameString() { return nameString; } public void setNameString(String nameString) { this.nameString = nameString; } //构造私有化 private Person(){ } public static Person getPerson(){ return person; } }
懒汉式
注意:有线程安全问题-----------------------------------懒汉式
多线程中,可能有多个调用,第一个线程判断为null,于是进行下边,但是在初始化过程中,下一个线程进来,而第一个初始化还没有完成,于是这两个线程都通过null判断
public class Person { private static Person person; private String nameString; public String getNameString() { return nameString; } public void setNameString(String nameString) { this.nameString = nameString; } //构造私有化 private Person(){ } public static Person getPerson(){//通过if判断-------------- if (person==null) { person=new Person(); } return person; } }
解决方法:
同步
public class Person { private static Person person; private String nameString; public String getNameString() { return nameString; } public void setNameString(String nameString) { this.nameString = nameString; } //构造私有化 private Person(){ } public static synchronized Person getPerson(){//加锁 if (person==null) { person=new Person(); } return person; } }
上一个解决的不够完美,但是多线程中还是存在线程安全
public static synchronized Person getPerson(){//这个代码中,只有person=new Person();被执行一次,因此为了高效率 无需将整个方法同步 if (person==null) { person=new Person(); } return person; }
重点:
public static Person getPerson(){ if (person==null) { synchronized (Person.class) { person=new Person(); } } return person; }
双重线程检查式
也涉及到线程安全问题,有可能两个方法几乎同时踏进if判断中,但是在return过程中,第一个还没完,第二个可能通过锁所以还需进行判断:
public class Person { private static Person person; private String nameString; public String getNameString() { return nameString; } public void setNameString(String nameString) { this.nameString = nameString; } //构造私有化 private Person(){ } public static Person getPerson(){ if (person==null) { synchronized (Person.class) { if (person==null) { person=new Person(); } } } return person; } }