- 单例模式
- 该对象在JVM内存中只存在一个实例。并对外提供一个函数获取该实例。
- 单例模式的实现方式
- 懒汉模式,饿汉模式(非线程安全),饿汉模式(线程安全),双重检验锁,静态内部类,枚举,容器类管理。
- 懒汉式
-
/**
* 单列模式-懒汉模式(非线程安全)
*/
public class Singleton02 implements Serializable {
private static Singleton02 singleton02;
public static Singleton02 getInstance(){
if(singleton02==null){
singleton02= new Singleton02();
}
return singleton02;
}
-
懒汉式因为是调用时创建,并发情况下可能会被多个来源同时访问。因此是线程不安全的。
-
- 饿汉式
-
/**
* 单例模式—饿汉模式
*/
public class Singleton01 {
private static Singleton01 singleton01=new Singleton01();
public static Singleton01 getInstance(){
return singleton01;
}
}
-
饿汉式启动就会创建该实例,所以是线程安全的。
-
- 饿汉式与懒汉式区别
- 饿汉模式:程序启动就会实例化对象。
- 懒汉模式:该对象第一次被调用的时候实例化对象
- 懒汉式(线程安全)
-
/**
* 单例模式-懒汉模式(线程安全)
*/
public class Singleton03 {
private static Singleton03 singleton03;
/**
* 添加同步锁防止该函数同时被多处调用
-
*
* @return*/
public static synchronized Singleton03 getInstance(){
if(singleton03==null){
singleton03=new Singleton03();
}
return singleton03;
}
}
-
每次访问该函数都需要获取锁,所以会影响效率。
-
- 双重校验锁
-
/**
* 单例模式-双重校验锁
*/
public class Singleton04 {
private static Singleton04 singleton04;
public static Singleton04 getInstance(){
//检查变量是否初始化,不获取锁
if(singleton04==null){
//获取锁
synchronized(Singleton04.class){
//第二次检查变量是否初始化
if(singleton04==null){
singleton04=new Singleton04();
}
}
}
return singleton04;
}
}
-
第一个if是检查变量是否被初始化。如果被初始化,不获取锁,直接返回对象。 第二个if是在多线程情况下保证只会被第一个拿到锁的线程初始化。后面的线程直接返回对象。
-
- 静态内部类
-
/**
* 单例模式之静态内部类
*/
public class Singleton05 {
private Singleton05 singleton05;
private static Singleton05 getInstance(){
return Singleton05s.singleton05;
}
public static class Singleton05s{
private static Singleton05 singleton05=new Singleton05();
}
}
静态内部类模式通过一个静态内部类来初始化对象,在创建该对象的时候调用内部类的静态变量来实现初始化对象。由于内部类是静态变量,所以也保证了线程的安全性。- -------------------------------------------------------------------------本文内容参考蚂蚁课堂精讲设计模式系列
-
Java设计模式之单例模式
最新推荐文章于 2024-10-10 21:26:33 发布