简单说说单例模式
Posted 是一个肥宅呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单说说单例模式相关的知识,希望对你有一定的参考价值。
对于大多数场景,懒汉式比较香~
因此 ,就讲述懒汉式单例模式。(因为我也懒~~)
双重检查
public class Sync {
public static void main(String[] args) {
System.out.println("双重检查 ... ");
Singleton instance = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.print("判断instance 是否 等于 instance2 : ");
System.out.println(instance == instance2);
System.out.println("instance hash : " + instance.hashCode());
System.out.println("instance2 hash :" + instance2.hashCode());
}
}
class Singleton {
// 实例化 Singleton 对象
private static volatile Singleton instance;
// 私有化构造器
private Singleton() {
}
// 提供一个静态的公有方法,加入双重检查代码 -> 解决 线程安全问题 ,和 懒加载的问题
public static synchronized Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
// while (instance == null) {
// instance = new Singleton();
//
// }
return instance;
}
}静态内部类
public class SingletonTest {
public static void main(String[] args) {
/**
* 1. 利用了类装载的机制 保证初始化实例的时候 ,只有一个线程
* 2. Singleton_demo 类 被装载时,并不会被实例化,而是在需要实例化的时候
* 装载SingletonInstance,从而完成 Singleton_demo 的实例化。
* 类的静态属性 只会在第一次加载类的时候初始化,初始化别的线程无法进入,
* JVM 确保线程安全性。
*/
System.out.println("使用静态内部类 完成单例模式 ... ");
Singleton_demo instance = Singleton_demo.getInstance();
Singleton_demo instance2 = Singleton_demo.getInstance();
Singleton_demo instance3 = Singleton_demo.getInstance();
System.out.print("判断instance 是否等于 instance2 且 instance2 等于 instance3: ");
System.out.println(instance == instance2 || instance2 == instance3);
System.out.println("instance hash : " + instance.hashCode());
System.out.println("instance2 hash :" + instance2.hashCode());
System.out.println("instance3 hash :" + instance3.hashCode());
}
}
class Singleton_demo {
private static volatile Singleton_demo instance;
private Singleton_demo () {}
// 静态内部类, 静态属性 Singleton_demo
public static class SingletonInstance{
private static final Singleton_demo INSTANCE = new Singleton_demo();
}
// 静态的公有方法,直接返回Singleton_demo.INSTANCE
public static synchronized Singleton_demo getInstance(){
return SingletonInstance.INSTANCE;
}
}枚举
public class SingletonTest02 {
public static void main(String[] args) {
Singleton_ instance = Singleton_.INSTANCE;
Singleton_ instance2 = Singleton_.INSTANCE;
System.out.println(instance == instance2);
System.out.println(instance.hashCode());
System.out.println(instance2.hashCode());
}
}
enum Singleton_ {
INSTANCE; // 属性
public void hello() {
System.out.println(" hello world ! ");
}
}
以上是关于简单说说单例模式的主要内容,如果未能解决你的问题,请参考以下文章