单例模式
Java中单例(Singleton)模式是一种广泛使用的设计模式。单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在。一些管理器和控制器常被设计成单例模式。
1.单例模式的特点
-
单例模式只能有一个实例。
-
单例类必须创建自己的唯一实例。
-
单例类必须向其他对象提供这一实例。
2.代码演示 饿汉式 和 懒汉式
package singletonpattern;
/**
* @author :xiaotao
* @date :2021/3/4 23:20
* @description: 单例模式 : 饿汉式 懒汉式
*
* 某个类只有一个实例存在
*/
public class SingletonTest {
public static void main(String[] args) {
//饿汉式
Singleton1 s1 = Singleton1.getInstance();
Singleton1 s2 = Singleton1.getInstance();
Singleton1 s3 = Singleton1.getInstance();
Singleton1 s4 = Singleton1.getInstance();
//同一个地址ip
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
System.out.println("===========================");
//懒汉式
Singleton2 o1 = Singleton2.getInstance();
Singleton2 o2 = Singleton2.getInstance();
Singleton2 o3 = Singleton2.getInstance();
//同一个地址ip
System.out.println(o1);
System.out.println(o2);
System.out.println(o3);
System.out.println("===========================");
}
}
/**
* 饿汉式(常用)
* 线程安全的,先创建好类的实例对象,类加载比较慢,因为要初始化,但是对象获取的速度特快
*/
class Singleton1{
//内部创建类的对象
private static final Singleton1 sing = new Singleton1();
//私有化构造器
private Singleton1(){
}
//提供公共的方法,返回类的对象
public static Singleton1 getInstance(){
return sing;
}
}
/**
* 懒汉式
* 线程不安全,不创建类的实例,用的时候再创建,延迟了对象的创建,类加载快,获取对象的速度慢
*/
class Singleton2{
private static Singleton2 sing = null;
private Singleton2(){ }
public static Singleton2 getInstance(){
if(sing==null){
sing = new Singleton2();
}
return sing;
}
}
/**
* 懒汉式 双重校验锁(不常用)
* 使线程安全
*/
class Sington {
private static volatile Sington sing;
public static Sington getInstance() {
//使用volatile修饰SINGTON保证可见性,提高效率
if (sing == null) {//①
synchronized (Sington.class) {//保证线程安全
//为了保证单例,返回的是同一个对象
if (sing == null) {
//② 分配内存空间
//③ 初始化对象
//④ 赋值给变量
sing = new Sington();
}
}
}
return sing;
}
}