简介
单例设计模式(Singleton Pattern),属于创建型模式,它提供了一种创建对象的方式.单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例
意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点,
优缺点
1.优点
- 内存中只有一个对象,减少内存开销
- 所有对象都访问唯一实例;
- 因为单一实例,可以达到数据共享,再不同的线程直接共享
2.缺点
- 由于单例模式中没有抽象层,扩展性差
实现
懒汉式:调用方法才创建对象
1.1 懒汉式,线程不安全
这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。
package com.wkq.interview.util;
import android.util.Log;
/**
* @author wkq
* @date 2022年07月13日 13:28
*
* @des
* 模式:单例设计模式-懒汉式(未加锁)
* 这种方式 lazy loading
* 缺点:很明显,未加锁不要求线程安全,在多线程不能正常工作。
*/
public class LazyNoLockSingletonPatternUtil {
private static LazyNoLockSingletonPatternUtil instance;
public static LazyNoLockSingletonPatternUtil getInstance() {
if (instance == null) instance = new LazyNoLockSingletonPatternUtil();
return instance;
}
public void doIt() {
Log.e("执行了:", "SingletonPattern");
}
}
1.2 懒汉式 线程安全(加锁 synchronized )
package com.wkq.interview.util;
import android.util.Log;
/**
* @author wkq
* @date 2022年07月13日 13:28
* @des 模式:单例设计模式-懒汉式(加锁)
* 这种方式 lazy loading
* 缺点:加锁,线程调用安全。
*/
public class LazyLockSingletonPatternUtil {
private static LazyLockSingletonPatternUtil instance;
public static synchronized LazyLockSingletonPatternUtil getInstance() {
if (instance == null) {
instance = new LazyLockSingletonPatternUtil();
}
return instance;
}
public void doIt() {
Log.e("执行了:", "SingletonPattern");
}
}
1.3 双检锁/双重校验锁
package com.wkq.interview.util;
import android.util.Log;
/**
* @author wkq
* @date 2022年07月13日 13:28
* @des 模式:单例设计模式-懒汉式(加锁)
* 这种方式 lazy loading
* 缺点:加锁,线程调用安全。
*
* synchronized 同步锁 同一时刻修改加锁的对象只能有一个线程得到执行,另一个线程阻塞,执行完之后等待线程才能执行
*
* volatile 多个线程访问同一变量情况下确保不会出错,不能保证线程安全
*/
public class DoubleLockSingletonPatternUtil {
// 锁 1
private volatile static DoubleLockSingletonPatternUtil instance;
public static DoubleLockSingletonPatternUtil getInstance() {
if (instance == null) {
// 锁 2
synchronized(DoubleLockSingletonPatternUtil.class){
instance = new DoubleLockSingletonPatternUtil();
}
}
return instance;
}
public void doIt() {
Log.e("执行了:", "SingletonPattern");
}
}
2.饿汉式
package com.wkq.interview.util;
import android.util.Log;
/**
* @author wkq
* @date 2022年07月13日 13:28
* @des 模式:单例设计模式-懒汉式(加锁)
* 这种方式 lazy loading
* 缺点:线程不安全 一调用就加载 浪费内存
*/
public class HungrySingletonPatternUtil {
private volatile static HungrySingletonPatternUtil instance =new HungrySingletonPatternUtil();
public static HungrySingletonPatternUtil getInstance() {
return instance;
}
public void doIt() {
Log.e("执行了:", "SingletonPattern");
}
}
网友评论