JAVA基础

JAVA 单例模式

2022-05-09  本文已影响0人  在岁月中远行

是指在内存中只会创建且仅创建一次对象的设计模式,在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象,可以采取单例模式。

单例模式类型

懒汉式:在真正需要使用对象时才去创建该单例对象。

饿汉式:在类加载时就已经创建好该单例对象,等待被程序使用。

线程安全,不能实现延迟加载 

懒汉式:

延迟加载 非线程安全

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

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

采取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;

    }

}

上一篇 下一篇

猜你喜欢

热点阅读