概念:指的是项目中只有一个该类的实例。
应用场景:
1.需要频繁创建的一些类(项目中需要大量的该类),使用单例可以降低系统的内存压力,减少 GC
2.某类只要求生成一个对象的时候
3.某些类创建实例时占用资源较多,或实例化耗时较长,且经常使用
方式1:
懒汉式)
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
方式2:
懒汉式:)
C](懒汉式:)public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
方式3:
饿汉式
TOCpublic class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
方式4:
https://blog.csdn.net/qq_27489007/article/details/84966680@[TOC](双重检锁 详解 很清晰)
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) { //第一次判断证明该对象不为空的话直接返回该对象就行 没必要加锁了
synchronized (Singleton.class) {
if (singleton == null) { //第二次判断是防止多个线程同时通过了第一次判断,如果不判断是否为null 就会变成多例了
singleton = new Singleton();
}
}
}
return singleton;
}
}
5、登记式/静态内部类
TOCpublic class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
6、枚举
TOCpublic enum Singleton {
INSTANCE;//肯定线程安全 只有一个被实例化的对象
public void doSomething() {
System.out.println("doSomething");
}
}
//调用方法
public class Main {
public static void main(String[] args) {
Singleton.INSTANCE.doSomething();
}
}
单纯的记一下笔记 不喜勿碰