单例模式 Idea

412 次浏览次阅读
没有评论

单例模式 Singleton

一个类只能有一个实例,且该实例是由自己自行创建

特点

  • 单例模式只有一个实例对象
  • 该单例对象必须由单例类自行创建
  • 对外提供一个获取该单例对象的公共方法

饿汉式单例

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();
    //     }
    // }

}
正文完
 0
评论(没有评论)