什么是单例?:其定义是单例对象的类只能允许一个实例存在

单例的实现基本原理:1.将该类的构造方法定义为私有访问,不对外暴露从而使其他类不能实例化该类对象,只能通过该类的静态方法得到该类的唯一实例 2.在该类中定义一个静态方法(getInstance),当我们调用该方法时返回该类的实例对象

几种实现方式:

饿汉式单例模式:

/**

  • 饿汉式静态常量式单例模式
  • 优点:这种写法在JVM装载类的时候就实例化了,避免了线程同步的问题
  • 缺点:在类装载的时候就实例化,没有达到延时加载的效果,造成内存浪费
  • @author zhuys

    */

    public class HungrySinglton {

    //使用经常常量初始化实例

    private final static HungrySinglton hungrySinglton = new HungrySinglton();

// 使用静态块初始化类的实例,与上面效果一致

// private static HungrySinglton hungrySinglton;

// static {

// hungrySinglton = new HungrySinglton();

// }

private HungrySinglton() {};

public static HungrySinglton getInstance() {
return hungrySinglton;
}

}

懒汉式单例模式(非同步):

/**

  • 懒汉式单例模式:非同步
  • 优点:在调用的时候初始化该单例
  • 缺点:并非线程同步,不建议使用
  • @author zhuys

*/

public class LazySingleton {

private static LazySingleton lazySingleton;

private LazySingleton() {};

public static LazySingleton getInstance() {
if(lazySingleton == null) {
lazySingleton = new LazySingleton();
}
return lazySingleton;
}

}

懒汉式单例(同步):

/**

  • 懒汉式单例模式:同步
  • 优点:在调用的时候初始化该单例并实现线程同步
  • @author zhuys

*/

public class LazySyncSingleton {

private static LazySyncSingleton lazySingleton;

private LazySyncSingleton() {};

//法1:该方式使用synchronized同步锁将整个方法同步 实现线程同步 但同步整个方法在高并发的情况下会造成阻塞
//效率低下,不推荐使用
public static synchronized LazySyncSingleton getInstance1() {
if(lazySingleton == null) {
lazySingleton = new LazySyncSingleton();
}
return lazySingleton;
} //法2:使用synchronized同步实例化改单例的代码块;但该方法不能完全实现同步,可能会产生多个实例;例如:在第一次创建时
//多个线程同时进入if(lazySingleton == null) 则会产生多个实例 不推荐使用
public static LazySyncSingleton getInstance2() {
if(lazySingleton == null) {
synchronized (LazySyncSingleton.class) {
lazySingleton = new LazySyncSingleton();
}
}
return lazySingleton;
}
//法3:双重检查法,同步代码块中再次检查一次是否w为null解决了上述问题 推荐使用
public static LazySyncSingleton getInstance3() { if(lazySingleton == null) {
synchronized (LazySyncSingleton.class) {
if(lazySingleton == null) {
lazySingleton = new LazySyncSingleton();
}
}
}
return lazySingleton;
}

}

内部类单例模式:

package pers.ly.learn.designModel.singleton;

/**

  • 静态内部类单例模式:
  • 静态内部类方式在InnerSingleton类被装载时并不会立即实例化
  • 因为静态内部类是在调用的时候才会实例化,这样就达到了延时加载节省资源的效果
  • 另外在静态内部类中通过静态常量初始化该单例又到达了保证其唯一性的效果
  • 优点:避免了线程不安全,延迟加载,效率高。 推荐使用
  • @author zhuys

*/

public class InnerSingleton {

private InnerSingleton() {};

private static class InnerSingletonInstance{
private final static InnerSingleton innerSingleton = new InnerSingleton();
} public static InnerSingleton getInstance() {
return InnerSingletonInstance.innerSingleton;
}

}

JAVA单例模式的实现伪代码的更多相关文章

  1. 用java单例模式实现面板切换

    1.首先介绍一下什么是单例模式: java单例模式是一种常见的设计模式,那么我们先看看懒汉模式: public class Singleton_ { //设为私有方法,防止被外部类引用或实例 priv ...

  2. 【深入】java 单例模式(转)

    [深入]java 单例模式 关于单例模式的文章,其实网上早就已经泛滥了.但一个小小的单例,里面却是有着许多的变化.网上的文章大多也是提到了其中的一个或几个点,很少有比较全面且脉络清晰的文章,于是,我便 ...

  3. 深入Java单例模式(转)

    深入Java单例模式 源自 http://devbean.blog.51cto.com/448512/203501 在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容 ...

  4. Java 单例模式的七种写法

    Java 单例模式的七种写法 第一种(懒汉,线程不安全) public class Singleton { private static Singleton instance; private Sin ...

  5. java单例模式之懒汉式分析

    转自:http://blog.csdn.net/withiter/article/details/8140338 今天中午闲着没事,就随便写点关于Java单例模式的.其实单例模式实现有很多方法,这里我 ...

  6. Java 单例模式探讨

    以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...

  7. 单例模式:Java单例模式的几种写法及它们的优缺点

    总结下Java单例模式的几种写法: 1. 饿汉式 public class Singleton { private static Singleton instance = new Singleton( ...

  8. 9种Java单例模式详解(推荐)

    单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象.  懒汉式(线程不安全) 其主要表现在单例类在外 ...

  9. 你真的理解了java单例模式吗?讲别人都忽略的细节!

    前言:老刘这篇文章敢做保证,java的单例模式讲的比大多数的技术博客都要好,讲述别人技术博客都没有的细节!!! 1 java单例模式 直接讲实现单例模式的两种方法:懒汉式和饿汉式,单例模式的概念自己上 ...

随机推荐

  1. c++ Convert struct to bytes

    D:\stock\Tskingfromgoogle\src\NetTS\TW.cpp Convert struct  to bytes //Convert struct to bytes 2019/0 ...

  2. 如何在Ubuntu上在多个PHP版本之间切换 (for swoole)

    摘要: 之前一直用Php7.0,今天想用7.2试下一些特性,安装完之后,切换回7.0却不能再使用7.0的swoole了,原来是切换方式出现了问题 一 从PHP 7.0 切换到 PHP 7.2 Apac ...

  3. Java Blob类型和String类型相互转换

    1.String 转 Blob: String content = "Hello World!"; Blob blob = Hibernate.createBlob(content ...

  4. springmvc中的视图模型的返回方式

    way1:略过; way2:(神似way1)通过在方法的参数中添加一个Model类型的参数,,该参数由spring自动生成传入, 然后在方法内部使用addAttribute()方式添加模型数据, 最后 ...

  5. 玩转Android状态栏

    前言 前段时间,突然收到一个状态栏颜色优化设计的任务,将原本应用整体的黑色状态栏修改为根据标题栏颜色进行沉浸式设计,显示效果如下:   image 经过分析及踩过N多坑,终于完成了APP全局的修改.现 ...

  6. python实现建造者模式

    python实现建造者模式 前言 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这些部件的 ...

  7. decodeURI decodeURIComponent

    操作 url 常用到编码与解码,一一对应就好 给力文章

  8. iphone手机软件安装目录

    iPhone系统常用文件夹位置 1.[/Applications] 常用软件的安装目录 2. [/private /var/ mobile/Media /iphone video Recorder] ...

  9. zabbix 数据库问题

    Too many connections ::052844.247 Cannot connect to the database. Exiting... :: started [trapper #] ...

  10. Spring学习之设计模式,动态代理和gclib动态代理

    传统的代理模式是静态代理,也就是在方法区域中写入方法. 而动态代理的作用是,不修改实现类的代码,能够在代码的前后或者抛出异常的前后执行某个方法. 动态代理类的实现 //Interface public ...