目录
- 1. 什么是单例模式
- 2. 饿汉模式
- 2.1 饿汉模式概念
- 2.2 饿汉模式代码
- 3. 懒汉模式
- 3.1 懒汉模式概念
- 3.2 单线程情况下的懒汉模式
- 3.3 单例模式的写法(保证线程安全)
- 4. wait 和 sleep 的区别
1. 什么是单例模式
保证某个类在程序中只存在一份实例,而不会创建多个实例,这样就会提高效率。
在单例模式中一般只提供一个getInstance()方法来获取实例对象,不提供setInstance()方法,目的是为了避免再实例化出其他实例对象。
其中单例模式中有两种模式一种是饿汉模式,一种是懒汉模式。
一般情况懒汉貌似较佳
用刷10个盘子来解释饿汉和懒汉
饿汉: 10个盘子管他用不用, 全部刷完
懒汉: 10个盘子, 我用几个盘子就刷几个盘子
2. 饿汉模式
2.1 饿汉模式概念
饿汉模式就是在类加载的时候立刻会实例化,后续使用就只会出现一份实例。
2.2 饿汉模式代码
//饿汉模式
public class HungrySingle {
//在类加载的时候就实例化了,类加载只有一次,所以值实例化出了一份该实例对象
private static HungrySingle instance = new HungrySingle();
public static HungrySingle getInstance() {
return instance;
}
}
3. 懒汉模式
3.1 懒汉模式概念
在类加载的时候没有直接实例化,而是调用指定实例方法的时候再进行实例化,这样就能保证不想使用的时候也不会实例化。一般来说比饿汉模式的效率高。
3.2 单线程情况下的懒汉模式
package thread.example;
//单线程的懒汉模式
public class LazySingle {
private static LazySingle instance = null;
//只有在调用该方法的时候才实例化
public static LazySingle getInstance() {
if(instance == null) {
instance = new LazySingle();
}
return instance;
}
}
3.3 单例模式的写法(保证线程安全)
class Singleton{
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
//禁止外部 new 实例
private Singleton() {
}
}
public class ThreadDemo17 {
public static void main(String[] args) {
// 此时s1 和 s2 是同一个东西
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
// Singleton singleton = new Singleton();
}
}