zoukankan      html  css  js  c++  java
  • 单例模式写法详解

    public class LazyUnSafeSingle {
    /** 优点:懒加载启动快,资源占用小,使用时才实例化,无锁。
    * 缺点:非线程安全。
    */
    private static LazyUnSafeSingle single = null;
    private LazyUnSafeSingle (){
    }
    public static LazyUnSafeSingle getInstance(){
    if(single == null){
    single = new LazyUnSafeSingle();
    }
    return single;

    }

    public class LazySafeSingle {
    /** 优点:懒加载启动快,资源占用小,使用时才实例化,加锁。
    * 缺点:synchronized 为独占排他锁,并发性能差。即使在创建成功以后,获取实例仍然是串行化操作。
    */
    private static LazySafeSingle single = null;
    private LazySafeSingle(){

    }
    public static synchronized LazySafeSingle getInstance(){
    if (single == null){
    single = new LazySafeSingle();
    }
    return single;
    }
    }

    public class LazySafeDoubleCheckLockSingle {
    /** 优点:懒加载,线程安全。
    * 缺点:实例必须有 volatile 关键字修饰,其保证初始化完全,(这里体现的是有序性)。
    */
    private volatile static LazySafeDoubleCheckLockSingle single = null;
    private LazySafeDoubleCheckLockSingle(){
    }
    public static LazySafeDoubleCheckLockSingle getInstance(){
    if(single == null){
    synchronized(LazySafeDoubleCheckLockSingle.class){
    if(single == null){
    single = new LazySafeDoubleCheckLockSingle();
    }
    }
    }
    return single;
    }
    }

    public class UnLazySafeSingle {
    /** 优点:饿汉模式天生是线程安全的,使用时没有延迟。
    * 缺点:启动时即创建实例,启动慢,有可能造成资源浪费。
    */
    private static UnLazySafeSingle single = new UnLazySafeSingle();
    private UnLazySafeSingle(){
    };
    public static UnLazySafeSingle getInstance(){
    return single;
    }


    }

    public class HolderSingle {
    /**
    * 优点:将懒加载和线程安全完美结合的一种方式(无锁)
    * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例,没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
    */
    private HolderSingle() {}

    private static class Holder{
    /**
    * 静态初始化器,由JVM来保证线程安全
    */
    private static HolderSingle single = new HolderSingle();

    }
    public static HolderSingle getInstance(){
    return Holder.single;
    }
    }
  • 相关阅读:
    [转]百度地图API详解之地图坐标系统
    [转]MBTiles 离线地图演示
    [shell 编程] if [ $# -eq 0 ]该语句是什么含义?
    [shell编程] sh脚本异常:/bin/sh^M:bad interpreter: No such file or directory
    [Android Studio] Android studio 多渠道打包(超简洁版)
    [Android Pro] Android中全局Application的onCreate多次调用问题
    [Java基础] Java如何实现条件编译
    [Git] 根据commiter过滤该用户的所有提交
    [Android Pro] Notification的使用
    [Git] Git把Tag推送到远程仓库
  • 原文地址:https://www.cnblogs.com/dw-haung/p/13846422.html
Copyright © 2011-2022 走看看