饿汉式单例模式
创建过程:(饿汉式:虽然可能没使用这个实例,但已经创建了)
-
将构造器私有化1
-
在类的内部创建私有的静态的对象
-
提供一个公共的静态方法,返回单例对象
package com.lzh.springcloud.day6; public class Single { public static void main(String[] args) { Girlfriend girlfriend=Girlfriend.getGirlfriend(); } } class Girlfriend{ private String name; //将构造器私有化,不能创建对象 private Girlfriend(String name){ this.name=name; } private static Girlfriend girlfriend=new Girlfriend("李婉娜"); public static Girlfriend getGirlfriend(){ return girlfriend; } }
单例模式懒汉式(线程不安全 )
创建过程:
-
仍然将构造器私有化
-
定义一个静态属性对象,但不new
-
提供一个static public方法,返回一个对象
-
只有但对象要求返回对象时,才new对象,当第二次访问对象时,会返回上次生成的对象
package com.lzh.springcloud.day6;
public class single2 {
public static void main(String[] args) {
Cat cat=Cat.getInstance();
}
}
class Cat {
private String name;
private Cat(String name){
this.name = name;
}
private static Cat cat;
public static Cat getInstance(){
if (cat == null) {
cat=new Cat("小猫");
}
return cat;
}
}
为什么线程不安全
当有多个线程同时进入下面代码区时
某几个线程同时判定,cat==null 成立,此时,多个线程同时创建了实例对象,此时不再符合单例,故而线程不安全