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

单例的实现基本原理: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. Druid + spring 配置数据库连接池

    1. Druid的简介 Druid是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBo ...

  2. unittest中的testCase执行顺序

    1.方法顺序 def setUp(self): 在测试方法前执行 def tearDown(self): 在测试方法后执行 class TestMethod(unittest.TestCase): # ...

  3. 作业调度框架Quartz.NET-现学现用-01-快速入门 - 简书

    原文:作业调度框架Quartz.NET-现学现用-01-快速入门 - 简书 前言 你需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行.一个自动执行而无须干预 ...

  4. C++ 大数运算(加减乘除取模)

    加法:(字符串模拟小学加法) string add(string s1, string s2) { int len1 = s1.length(), len2 = s2.length(); ; '); ...

  5. Ubantu 手动设置DSL连接

    参考链接:https://m.linuxidc.com/Linux/2015-07/119774.htm

  6. 定义一个数组,并对这个数组进行动态初始化,使用sort方法进行排序后,再将数组中的元素倒置过来。

    Sort方法,生序排序 package com.fs.array; import java.util.Arrays; public class ArraySort { public static vo ...

  7. 吴恩达深度学习:2.15python中的广播

    1.Broadcasting example (1)下面矩阵描述了来自四种不同的100克碳水化合物,蛋白质和脂肪的卡路里数量 比如说100g苹果所含的热量有56克来自碳水化合物,相比之下来自蛋白质和脂 ...

  8. J2EE WEB应用架构分析

    1. 架构概述 J2EE体系包括java server pages(JSP) ,java SERVLET, enterprise bean,WEB service等技术.这些技术的出现给电子商务时代的 ...

  9. numpy.hstack(tup)

    numpy.hstack(tup) Stack arrays in sequence horizontally (column wise). Take a sequence of arrays and ...

  10. 在docker容器中为elasticsearch配置跨域访问

    一.在docker容器中进入elasticsearch对应的容器 docker exec -it [容器名] /bin/bash 二.安装vim编辑器 因为我们需要更改配置文件,安装过的朋友就不用安装 ...