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();
    }
    }
  • 相关阅读:
    Flink 1.9 实战:使用 SQL 读取 Kafka 并写入 MySQL
    Spring 社区的唯一一个国产开源项目
    使用DynamoShake从dynamodb迁移到mongodb
    1754-I Hate It 线段树(单点替换,区间最值)
    1166-敌兵布阵 线段树(单点增减,区间求和)
    P1078 文化之旅
    P1107 最大整数
    521. [NOIP2010] 引水入城 cogs
    P1137 旅行计划
    P2678 跳石头(二分答案)
  • 原文地址:https://www.cnblogs.com/badboys/p/12517306.html
Copyright © 2011-2022 走看看