zoukankan      html  css  js  c++  java
  • 单例模式

    饿汉模式 
    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();
    }
    }
  • 相关阅读:
    探索c#之一致性Hash详解
    Redis系列(三)-Redis发布订阅及客户端编程
    Redis系列(二)-Hredis客户端设计及开源
    关于电脑操作一些高效的方法工具
    探索c#之递归APS和CPS
    探索C#之系列目录导航
    探索c#之不可变数据类型
    SOA相关资料整理分享
    探索c#之尾递归编译器优化
    探索c#之函数创建和闭包
  • 原文地址:https://www.cnblogs.com/badboys/p/12517306.html
Copyright © 2011-2022 走看看