一个类只能有一个实例,且该实例是由自己自行创建
特点
- 单例模式只有一个实例对象
- 该单例对象必须由单例类自行创建
- 对外提供一个获取该单例对象的公共方法
饿汉式单例
package com.learn.singleton;
/**
* 类加载到内存后,就实例一个单例,JVM线程安全
* 缺点:不管有没有用到,类装载时都会实例化
*/
/**
* 类加载到内存后,就实例一个单例,JVM线程安全
* 缺点:不管有没有用到,类装载时都会实例化
*/
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
// public static void main(String[] args) {
// Singleton instance1 = Singleton.getInstance();
// Singleton instance2 = Singleton.getInstance();
// System.out.println(instance1 == instance2);
// }
懒汉式单例
package com.learn.singleton;
/**
* 使用synchronized解决线程不安全的问题
* synchronized直接加在方法上会单来性能问题
*/
public class Singleton {
private static volatile Singleton INSTANCE = null;
private Singleton() {
}
public static Singleton getInstance() {
if (INSTANCE == null) {
// 双重检查
synchronized (Singleton.class) {
if (INSTANCE == null) {
// try {
// Thread.sleep(1);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
// public static void main(String[] args) {
// for (int i = 0; i < 50; i++) {
// new Thread(() -> {
// System.out.println(Singleton.getInstance().hashCode());
// }).start();
// }
// }
}