单例模式指的是一个类只能产生一个实例化对象
如果希望只能产生一个实例化对象 那么需要将这个类保持一个相对封闭状态即使用一个私有的无参构造方法覆盖默认的无参构造方法 然而此时因为private修饰 构造方法不能调用 所以想到一个方法就是在类中优先实例化对象 因此实例化对象此时就是一个类中普通属性 使用static关键字修饰就可以实现需求 然后使用private修饰属性 getter()方法完善 此时就实现了单例模式
饿汉式方法:从一开始就创建好对象
package com.bite.angda;
class Singleton{
private static final Singleton singleton=new Singleton();
private void Singleton(){};
public static Singleton getSingleton(){
return singleton;
}
public void print(){
System.out.println("hello");
}
}
public class Angdalove{
public static void main(String[] args){
Singleton singleton=Singleton.getSingleton();
singleton.print();
}
}
懒汉式方法:当使用的时候才开始创建对象
package com.bite.angda;
class Singleton{
private static Singleton singleton;
private void Singleton(){};
public static Singleton getSingleton(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
public void print(){
System.out.println("hello");
}
}
public class Angdalove{
public static void main(String[] args){
Singleton singleton=Singleton.getSingleton();
singleton.print();
}
}
因为懒汉式是在使用的时候才开始创建对象 所以在多线程的情况下 会存在线程安全问题 所以懒汉式是线程不安全的 饿汉式是线程安全的 所以为了使懒汉式在多线程的情况下使用安全 就想到双重判断以及加锁方法
线程安全的懒汉式单例模式
package com.bite.angda;
class Singleton{
private volatile static Singleton singleton;
private void Singleton(){};
public static Singleton getSingleton(){
if(singleton==null){
synchronized(Singleton.class){
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
public void print(){
System.out.println("hello");
}
}
public class Angdalove{
public static void main(String[] args){
Singleton singleton=Singleton.getSingleton();
singleton.print();
}
}