创建型设计模式之单例模式
发布于: 3 小时前
单例模式:(Singleton)
单例的有且只有一个实例对象
要点:
创建-构造器私有
可以外部访问
静态;
我自己写的是这样的:
/**
* @author Lucas
* @create 2021-08-10 15:01
* @description 单例模式的实体类
*/
public class Person {
private String name;
private Integer age;
/**
* 单例模式;要求此系统中有且只有一个实例对象;
*
* 1.确定是饿汉式还是懒汉式,然后创建一个静态的私有变量
* 2.构造器私有化
* 3.外部访问对象,要从我们自己构造好的私有对象返回 *
*/
/**
* 1.确定是饿汉式还是懒汉式,然后创建一个静态的私有变量
* private static final Person Instanc=new Peson(); 饿汉式,不让变动
*/
private static Person Instance; //懒汉式时间换空间
/**
* 2.构造器私有化
*/
private Person (){
System.out.println("需要创建一个对象person");
}
/**3.外部访问
* 公共的静态方法-->利用静态存储方法区,
* 建立一个静态的空对象,如果需要就一直存在,直至程序完结
* @return
*/
public static Person getPerson(){
//多线程情况下不安全
if (Instance==null){
Person person=new Person();
Instance=person;
}
return Instance;
}
public static void main(String[] args) {
//静态的公共获取方法--对象都一样
Person person1 = Person.getPerson();
Person person2 = Person.getPerson();
System.out.println(person1==person2);
}
}
复制代码
上述的情况在于多线程的是不安全的;如何优化呢
* 公共的静态方法-->利用静态存储方法区,
* 建立一个静态的空对象,如果需要就一直存在,直至程序完结
* @return
*/
public static synchronized Person getPerson(){
//多线程情况下不安全
if (Instance==null){
Person person=new Person();
Instance=person;
}
return Instance;
}
复制代码
优化二:
/**
* @author Lucas
* @create 2021-08-10 15:16
* @description 单例模式的实体类
*/
public class Person {
private String name;
private Integer age;
/**
* 单例模式;要求此系统中有且只有一个实例对象;
*
* 1.确定是饿汉式还是懒汉式,然后创建一个静态的私有变量
* 2.构造器私有化
* 3.外部访问对象,要从我们自己构造好的私有对象返回 *
*/
/**
* 1.确定是饿汉式还是懒汉式,然后创建一个静态的私有变量
* private static final Person Instanc=new Peson(); 饿汉式,不让变动
*/
private static volatile Person Instance;
/**
* 2.构造器私有化
*/
private Person (){
System.out.println("需要创建一个对象person");
}
/**3.外部访问
* 公共的静态方法-->利用静态存储方法区,
* 建立一个静态的空对象,如果需要就一直存在,直至程序完结
* @return
*/
public static Person getPerson(){
//多线程情况下不安全
if (Instance==null){
synchronized (Person.class){
//同步代码块+双重检查锁(+ volatile内存可见性,创建对象防止指令重排序)
if (Instance==null){
Person person=new Person();
Instance=person;
}}
}
return Instance;
}
public static void main(String[] args) {
//静态的公共获取方法--对象都一样
Person person1 = Person.getPerson();
Person person2 = Person.getPerson();
System.out.println(person1==person2);
}
}
复制代码
本质上: 对于单列模式:基本是双重锁+内存可见性
2.2.单例模式的适用场景:
系统信息,环境变量的基础信息:
划线
评论
复制
发布于: 3 小时前阅读数: 4
版权声明: 本文为 InfoQ 作者【卢卡多多】的原创文章。
原文链接:【http://xie.infoq.cn/article/2ae54fd21812573e3d38041aa】。文章转载请联系作者。
卢卡多多
关注
努力寻找生活答案的旅途者 2020.04.12 加入
公众号:卢卡多多,欢迎一起交流学习
评论