JAVA 单例模式
是指在内存中只会创建且仅创建一次对象的设计模式,在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象,可以采取单例模式。
单例模式类型
懒汉式:在真正需要使用对象时才去创建该单例对象。
饿汉式:在类加载时就已经创建好该单例对象,等待被程序使用。
线程安全,不能实现延迟加载

懒汉式:
延迟加载 非线程安全

如果一个对象使用率不高,占用内存还特别大,明显就不适合饿汉式了,那就采用懒加载思想。

当把锁加载静态方法时 可以解决线程安全问题,但每次获取都需要加锁 ,性能低下。

采取DCL 效率比上次提升,创建后不必每次加锁,锁代码块 ,粒度更细。
volaile关键字是禁止指令重排。
使用静态内部类实现单例模式。

延迟加载 线程安全(利用类加载机制 双亲委派机制保证一个类只加载一次 从而保证线程安全)
接下来讲破坏单例的三种方式:
1 反射 2 序列化 3 克隆
package com.example.aaaa;
import androidx.annotation.NonNull;
import java.io.ObjectStreamException;
import java.io.Serializable;
//完整版单例
public class Singletonimplements Serializable,Cloneable {
private static volatile Singletonsingleton;
private static volatile boolean isCreate=false;
private Singleton(){
//防止反射破坏单例
if(isCreate){
throw new RuntimeException("已经实例化了,不能再实例化了");
}
isCreate=true;
}
public static SingletongetInstance(){
if (singleton==null) {
synchronized (Singleton.class){
if(singleton==null){
singleton=new Singleton();
}}}
return singleton;
}
@NonNull
@Override
protected Objectclone()throws CloneNotSupportedException {
//防止克隆破坏
return singleton;
}
//防止序列化破坏
private ObjectreadResolve()throws ObjectStreamException {
// instead of the object we're on,
// return the class variable INSTANCE
return singleton;
}
}