• 单例模式


    饿汉模式 
    public class Singleton01 {
    private static final Singleton01 INSTANCE = new Singleton01();

    private Singleton01(){}

    public static Singleton01 getInstance(){return INSTANCE;}

    public static void main(String [] args){
    Singleton01 s1 = Singleton01.getInstance();
    Singleton01 s2 = Singleton01.getInstance();
    System.out.println(s1 == s2);
    }
    }

    懒汉模式
    public class Singleton03 {

    //TODO 加final必须要初始化
    private static Singleton03 INSTANCE;

    private Singleton03(){}

    /**
    * 哈希码相同也可能不是同一个对象
    *同一个类的不同对象 哈希码是不同的
    * **/
    public static Singleton03 getInstance(){
    if(INSTANCE==null){
    // try{
    // Thread.sleep(300);
    // }catch (Exception e){
    // e.printStackTrace();
    // }
    INSTANCE = new Singleton03();
    }
    return INSTANCE;
    }

    /**
    * 不同对象的哈希码不同
    * **/
    public static void main(String [] args){
    for(int i=0;i<10;i++){

    new Thread(()->{
    System.out.println(Singleton03.getInstance().hashCode()); //不同对象的哈希码不同
    }).start();

    // new Thread(new Runnable() {
    // @Override
    // public void run() {
    // //TODO 匿名内部类 lambda对只有一个方法的匿名接口
    // }
    // }).start();
    }
    }
    枚举单例
    public enum Singleton08 {
    INSTANCE;

    public void m (){} //业务处理 通过反射、发序列化方式

    public static void main(String [] args){
    for (int i=0;i<100;i++){
    new Thread(()->{
    System.out.println(Singleton08.INSTANCE.hashCode());
    }).start();
    }
    }

    double check 双重认证
    public class Singleton06 {
    private static volatile Singleton06 INSTANCE; //TODO 需要加volatile JIT语句重排 需要指令重排

    private Singleton06(){}

    private static Singleton06 getInstance(){
    if(INSTANCE == null){
    //双重检查
    synchronized (Singleton06.class){
    if(INSTANCE == null){
    try{
    Thread.sleep(1);
    }catch (InterruptedException e){
    e.printStackTrace();
    }
    INSTANCE = new Singleton06();
    }
    }
    }
    return INSTANCE;
    }

    public static void main(String [] args){
    new Thread(()->System.out.println(Singleton06.getInstance())).start();
    }
    }
  • 相关阅读:
    [转] 献给所有正在找路的人
    在同一表单内,多个提交按钮的处理方式
    javascript高级选择器querySelector和querySelectorAll
    一位年轻女董事长的37条忠告很受启发吧?
    函数的延迟加载
    WCF的CommunicationObjectFaultedException异常问题
    WCF Test Client对象数组输入问题
    [转载]C#开发Winform记录用户登录状态的方法
    using(C#)
    使用 SCTP 优化网络
  • 原文地址:https://www.cnblogs.com/badboys/p/12517306.html
Copyright © 2020-2023  润新知